如何在类中动态分配内存?
为了澄清我的问题我做了一个例子。我将构建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如何分配和释放内存。当然只有基本的分配。
答案 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;
}