我最近开始学习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);
}
}
答案 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 *
,它将正常工作。