继承内存管理

时间:2013-10-17 18:25:16

标签: c++ inheritance

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. 最简单的方法是设计这个而不会造成任何问题吗?
  3. 我应该删除缓冲区然后在类msgA2中分配一个新缓冲区,因为以前调用了msgA构造函数

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

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

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

2 个答案:

答案 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管理内存(并删除析构函数中的缓冲区)。