1
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
   }
};
  1. msgA2 构造函数中是否存在内存泄漏?
  2. 在不引起任何问题的情况下设计它的最佳方法是什么?

我应该删除缓冲区然后在 msgA2 类中分配一个新缓冲区,因为之前调用了 msgA 构造函数

编辑:有一个析构函数 delete []

我在构造函数中添加了以下内容

if(this->buffer != NULL)
{
    delete [] this->buffer ;
    this->pMsgBuffer = NULL;
}
4

2 回答 2

2

“ClassA2 构造函数中是否存在内存泄漏?”

目前,就您的代码而言,没有内存分配,因此没有内存泄漏。然而,我担心您将为您的buffer成员分配内存的方式。它会在构造函数中吗?是否需要一个显式处理此内存的析构函数?如果您必须实现析构函数,请不要忘记复制构造函数赋值运算符三规则)。

“在不引起任何问题的情况下设计它的最佳方法是什么?”

最好的办法是避免自己处理内存管理。用于std::vector<unsigned char>二进制数据或std::string字符串。

于 2013-10-17T18:30:04.377 回答
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管理内存(并删除析构函数中的缓冲区)。

于 2013-10-17T18:36:59.527 回答