类中的动态内存分配

时间:2016-09-13 09:39:40

标签: c++ memory memory-management dynamic-memory-allocation

如何在类中动态分配内存?

为了澄清我的问题我做了一个例子。我将构建A的实例a并将其复制到b中。使用后, b将被破坏,分配的内存将在析构函数中被释放两次。

那我该如何处理这种情况?

#include <stdlib.h>

class A {
public:
    char * allocatedMemory;
    A(int length) {
        allocatedMemory = (char *) malloc(sizeof(char) * length);
    }

    ~A(){
        free(allocatedMemory);
    }
};

int main() {
    A a = A(50);
    A b = a;
    return 0;
}

PS:理解上下文:我试图通过示例弄清楚std :: string如何分配和释放内存。当然只有基本的分配。

1 个答案:

答案 0 :(得分:3)

您遇到的问题是由于浅拷贝造成的。如果您不明确提供复制构造函数,则编译器将提供默认复制构造函数,以使用exising对象对一个对象进行初始化。默认的复制构造函数执行按位复制。即只需将存储在一个对象的指针中的地址复制到另一个对象。要避免这种双重免费问题,您需要进行深层复制。编写自己的复制构造函数,在该复制构造函数中使用new为您的字符指针显式分配内存,然后使用memcpy()复制实际内容。希望这会有所帮助。

 #include <stdlib.h>
 class A 
 {
    public:
    char * allocatedMemory;
    int length;
    A(int length):length(length) 
    {
          // i am ignoring exception due to failure in new to keep code simple
          this->allocatedMemory = new char[length];
    }
    A(const A& obj)
    {
        this->allocatedMemory = new char[obj.length];
        memcpy(this->allocatedMemory, obj.allocatedMemory, obj.length);
        this->length = obj.length;

    }
    A& operator=(const A& obj)
    {
         if(this != &obj)
         {
             if(this->length == obj.length)
             {
                 memcpy(this->allocatedMemory, obj.memory, obj.length);
             }
             else
             {
                 delete[] this->allocatedMemory;
                 this->allocatedMemory = NULL;
                 this->allocatedMemory = new char[obj.length];
                 memcpy(this->alocatedMemory, obj.allocatedMemory, obj.length);
                 this->length = obj.length;
             }
        }
        return *this;
     }


    ~A()
   {
        if(allocatedMemory)
            delete[] allocatedMemory;
   }
};

int main() 
{
    A a = A(50);
    A b = a;
    return 0;
}