【发布时间】:2015-05-01 10:07:44
【问题描述】:
我看过几个复制赋值运算符的例子,不明白为什么我们需要删除复制赋值运算符中的指针。例如,如果我有以下课程
class MyClass
{
public:
MyClass(int a)
{
x = new int(a);
}
MyClass& operator=(const MyClass& pMyClass)
{
*x = *(pMyClass.x);
// ?????????
// delete x;
// x = new int(*(pMyClass.x));
}
~MyClass()
{
delete x;
}
private:
int* x;
}
*x = *(pMyClass.x) 行有什么问题?我只是在复制 pMyClass.x 指向的对象,为什么我需要删除并再次创建它?谁能举例说明这段代码什么时候会导致内存泄漏?
【问题讨论】:
-
您的“改进”是完全有效的,但是
x首先是一个指针有什么意义呢?通常你会看到x指向一个数组,而旧数组的大小不适合新数据。然后你需要重新分配。 -
存储分配的大小:
a然后在复制构造函数中,分配那么多并“复制”到新分配的内存。 -
除了显而易见的(对这个特定的实现使用指针毫无意义)之外,你提出的一个地方 not 工作将是一个 not 可复制分配,但是 可复制构造的。显然
int不属于这一类。