构造函数中的Malloc在通过New调用时返回NULL

时间:2016-05-22 16:46:24

标签: c++ constructor

我最近开始学习c ++(我已经有了c的中级水平)。我理解,构造函数背后的想法以及它们如何工作,但我不明白为什么当我使用new创建Packet对象时,构造函数中的malloc返回NULL / 0x0内存位置。如果我定义一个Packet对象,我对构造函数中的malloc没有任何问题。 这是代码,希望格式/编码的任何更正:

public class ToolStripCheckedBoldRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
    {
        if (e.Item is ToolStripMenuItem && ((ToolStripMenuItem)e.Item).Checked)
        {
            e.TextFont = new Font(e.Item.Font, FontStyle.Bold);
        }

        base.OnRenderItemText(e);
    }
}

3 个答案:

答案 0 :(得分:6)

首先,您要创建一个本地变量 - 而不是分配给您的成员:

Packet(unsigned int size)
{
    size_pck=size;
    packet_data=(char *)malloc(size);
}

另一方面,在C ++中已经有了一种方便的方法来保持动态大小的char数组:std::vector

class Packet {
    std::vector<char> packet_data;
public:
    Packet(unsigned int size)
    : packet_data(size)
    { }
};

这具有在复制Packet时不会泄漏内存的额外好处。或者,std::unique_ptr<char[]>使用额外大小的成员,以避免初始化char - 如果这很重要。

答案 1 :(得分:2)

在构造函数中,您需要更改

中的代码
char *packet_data=(char *)malloc(size);  

packet_data=(char *)malloc(size);  

您正在为局部变量分配内存,而您需要为类变量分配内存。

答案 2 :(得分:0)

在构造函数中,您将定义一个隐藏packet_data成员的局部变量。删除构造函数中的char *,它将正常工作。