簡體   English   中英

這個“智能指針”代碼會泄漏內存嗎?

[英]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)時發生的情況:

  1. new int(9)分配內存用於單個int在堆(9),並返回一個指向這個存儲器(一個int * )。
  2. 使用上面獲得的int *和適當的構造函數創建一個IntPtr
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM