[英]Will this “smart pointer” code leak memory?
我想知道來自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 *
)。 int *
和適當的構造函數創建一個IntPtr
。 IntPtr::operator=
被調用,其中LHS a和上面創建的IntPtr
作為RHS。 此操作為單個int分配另一個內存塊。 這個新塊的地址存儲在ap
。 當到達最后一個右括號時, a
被銷毀,第二個內存塊也隨之被銷毀。 我的問題是:第一塊現在發生了什么? 它仍然在堆上,什么也沒有指向嗎? 行動2創建的IntPtr
的命運是什么?
我的問題是:第一塊現在發生了什么? 它仍然在堆上,什么也沒有指向嗎? 行動2創建的IntPtr的命運是什么?
您可以重寫此行:
a = new int(9);
如:
a = IntPtr(new int(9));
^^^^^^
編譯器在分配期間創建一個臨時對象,該對象將在分配期間使用。 它的析構函數將在語句的末尾被調用(在行的末尾使用分號)。
此代碼看起來不錯-不會發生內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.