C++ 这会不会";“智能指针”;代码泄漏内存? 我想知道,当代码 fn>代码>被称为:
时,从加速C++部分中删除这个代码是否会导致内存泄漏?C++ 这会不会";“智能指针”;代码泄漏内存? 我想知道,当代码 fn>代码>被称为:,c++,memory,memory-leaks,C++,Memory,Memory Leaks,时,从加速C++部分中删除这个代码是否会导致内存泄漏? 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
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=newint(9)
时会发生的情况:
newint(9)
为堆中的单个int
(9)分配内存,并返回指向该内存的指针(一个int*
)int*
和适当的构造函数创建IntPtr
IntPtr::operator=
,将LHS a和上面创建的IntPtr
作为RHS。此操作为单个int分配另一个内存块。此新块的地址存储在a.p
中a
被销毁,第二个内存块也随之被销毁。我的问题是:到现在为止,第一个街区发生了什么?它还在堆上,没有任何东西指向它吗?在行动2中创建的IntPtr
的命运是什么
我的问题是:到现在为止,第一个街区发生了什么?它还在堆上,没有任何东西指向它吗?在行动2中创建的IntPtr的命运是什么
您可以重写这一行:
a = new int(9);
作为:
编译器在赋值期间创建一个临时对象,该对象将在赋值期间使用。它的析构函数将在语句末尾被调用(行末尾的分号)
此代码看起来正常-不应发生内存泄漏。使用调试器,写下内存块的地址,逐步执行代码。第2节的
IntPtr
是临时创建的。任务完成后,它将被销毁。为了说明发生了什么,将输出添加到IntPtr
的每个方法中,您将在控制台上看到这一点。在步骤2中创建的IntPtr
是临时的,并且在语句a=new int(9)
完成时不再存在。或者,您可以考虑“移动分配”它将指针从RHS传输到LHS,并将RHS重置为0。为此,您必须将参数更改为IntPtr&other
。这可能会有帮助:我查看了亚马逊,这本书加速了C++的过时:(2000年8月24日)。它肯定不包括自C++11以来的更改。在更现代的书中,作者会建议使用智能指针。但这可能是一个关于类如何工作的练习。从内存泄漏的角度来看,代码看起来还可以,但在其他方面(即,它不是异常安全的)。它看起来更像是一个关于类如何工作的练习。
a = IntPtr(new int(9));
^^^^^^