这个"智能指针"代码会泄漏内存吗?

ack*_*inc 2 c++ memory memory-leaks

我想知道来自Accelerated C++ Section 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);
}
Run Code Online (Sandbox Code Playgroud)

这是我认为a = new int(9)到达线时会发生的事情:

  1. new int(9)int堆中的单个(9)分配内存,并返回指向该内存的指针(a int *).
  2. IntPtr使用int *上面获得的和适当的构造函数创建An .
  3. IntPtr::operator=被称为LHS a和IntPtr上面创建的RHS.此操作为单个int分配另一个内存块.该新块的地址存储在a.p.

当达到最后一个右大括号时,会a被破坏,并且第二个内存块与它一起被破坏.我的问题是:现在第一个街区发生了什么?它仍然在堆上,没有指向它吗?IntPtr在行动2中创造的命运是什么?

mar*_*inj 5

我的问题是:现在第一个街区发生了什么?它仍然在堆上,没有指向它吗?在行动2中创建的IntPtr的命运是什么?

你可以改写这一行:

a = new int(9);
Run Code Online (Sandbox Code Playgroud)

如:

a = IntPtr(new int(9));
    ^^^^^^ 
Run Code Online (Sandbox Code Playgroud)

编译器在赋值期间创建一个将在赋值期间使用的临时对象.它的析构函数将在语句的末尾调用(行尾的分号).

此代码看起来没问题 - 不应发​​生内存泄漏.