【问题标题】:inheritance memory management managing继承内存管理管理
【发布时间】:2013-10-17 18:25:16
【问题描述】:
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 构造函数

edit:有一个析构函数delete[]

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

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

【问题讨论】:

  • 多重继承是指从多个类为一个类继承。缓冲区会是一个字符串吗?为什么不使用std::string
  • 1.在您的示例中没有名为 ClassA2 的类。如果你的意思是msgA2,那么是的,除非它首先释放msgA 构造函数分配的内存。 2. 很难说,因为你没有指定任何设计目标。
  • 哦,好的,谢谢,它是一个普通的字符数组,根据消息的大小不同,每条消息可以有一堆变量和迷你缓冲区。

标签: c++ inheritance


【解决方案1】:

您可以让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 管理内存(并在析构函数中删除缓冲区)。

【讨论】:

  • 我喜欢将分配/解除分配移到基地
【解决方案2】:

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

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

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

最好避免自己处理内存管理。二进制数据使用std::vector<unsigned char>,如果是字符串则使用std::string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2017-07-06
    • 1970-01-01
    • 2011-07-21
    • 2012-03-21
    相关资源
    最近更新 更多