class base
{
public:
base() : buffer(NULL) {}
private:
unsigned char * buffer;
};
class msgA : public base
{
public:
msgA()
{
//alocate memory for buffer size X
this->buffer = new (std::nothrow) unsigned char[A_MSG_SIZE]; // A_MSG_SIZE = 20
}
};
class msgA2 : public msgA
{
msgA2()
{
//alocate memory for buffer size X2
this->buffer = new (std::nothrow) unsigned char[A2_MSG_SIZE]; // A2_MSG_SIZE = 30
}
};
我应该删除缓冲区然后在类msgA2中分配一个新缓冲区,因为以前调用了msgA构造函数
编辑:有一个析构函数delete []
我在构造函数中添加了以下内容
if(this->buffer != NULL)
{
delete [] this->buffer ;
this->pMsgBuffer = NULL;
}
答案 0 :(得分:2)
“ClassA2构造函数中是否存在内存泄漏?”
目前,当您的代码代表时,没有内存分配,因此没有内存泄漏。但是我担心你为buffer
成员分配内存的方式。它会在构造函数中吗?是否需要一个将明确处理此内存的析构函数?如果必须实现析构函数,请不要忘记复制构造函数和赋值运算符(Rule of Three)。
“最简单的方法是设计这个而不会造成任何问题?”
最好是避免自己处理内存管理。使用std::vector<unsigned char>
表示二进制数据,或std::string
表示字符串。
答案 1 :(得分:2)
您可以让base
分配内存,将缓冲区大小作为构造函数的参数传递。像
class base
{
protected:
base(size_t size) { /* allocate */ }
unsigned char * buffer;
};
class msgA : public base
{
public:
msgA() : base(X)
{
}
protected:
msgA(size_t size) : base(size)
{
}
};
class msgA2 : public msgA
{
public:
msgA2() : msgA(X2)
{
}
};
这样你就可以base
管理内存(并删除析构函数中的缓冲区)。