我想知道来自 Accelerated C ++ 第14.1.2节的代码是否在调用fn
时导致内存泄漏:
class IntPtr {
public:
IntPtr (): p(NULL) {};
IntPtr (int *ip): p(ip) {};
IntPtr (const IntPtr& other) { p = new int(*other.p); };
IntPtr& operator= (const IntPtr&);
~IntPtr () { delete p; };
private:
int *p;
}
IntPtr& IntPtr::operator= (const IntPtr& other) {
if (&other != this) { delete p; p = new int(*other.p); }
return *this;
}
void fn () {
IntPtr a;
a = new int(9);
}
以下是我认为到达行a = new int(9)
时会发生的事情:
new int(9)
为堆中的单个int
(9)分配内存,并返回指向此内存的指针(int *
)。IntPtr
和相应的构造函数创建int *
。IntPtr::operator=
,LHS a和上面创建的IntPtr
为RHS。此操作为单个int分配另一个内存块。此新块的地址存储在a.p
。当到达最后一个右括号时,a
被破坏,第二块内存被破坏。我的问题是:现在第一个街区发生了什么?它仍然在堆上,没有指向它吗?在行动2中创建IntPtr
的命运是什么?
答案 0 :(得分:5)
我的问题是:现在第一个街区发生了什么?它仍然在堆上,没有指向它吗?在行动2中创建的IntPtr的命运是什么?
你可以改写这一行:
a = new int(9);
为:
a = IntPtr(new int(9));
^^^^^^
编译器在赋值期间创建一个临时对象,该对象将在赋值期间使用。它的析构函数将在语句的末尾被调用(行尾的分号)。
此代码看起来没问题 - 不应发生内存泄漏。