这个网站上有很多回答都提到delete()
会调用析构函数。但下面示例代码中似乎在析构函数中调用了delete()
,那么当对象在堆栈和堆中初始化时,delete()
的正确使用方法是什么呢?
#include <iostream>
using namespace std;
class SmartPtr {
int* ptr; // Actual pointer
public:
// Constructor: Refer https:// www.geeksforgeeks.org/g-fact-93/
// for use of explicit keyword
explicit SmartPtr(int* p = NULL) { ptr = p; }
// Destructor
~SmartPtr() { delete (ptr); }
// Overloading dereferencing operator
int& operator*() { return *ptr; }
};
int main()
{
SmartPtr ptr(new int());
*ptr = 20;
cout << *ptr;
// We don't need to call delete ptr: when the object
// ptr goes out of scope, the destructor for it is automatically
// called and destructor does delete ptr.
return 0;
}
SmartPtr
和它所管理内存中的int
。~SmartPtr()
调用delete
来删除int
对象,而不是它自己。 - YSCdelete ptr
,那么指向ptr
的对象将永远不会被销毁。与其他(垃圾回收)语言不同,在C++中没有隐式清理动态分配的对象。简单来说,如果你从析构函数中删除了delete ptr
,则该代码中的对象(类型为int
)将被泄漏(没有指针指向它,因此程序中的任何代码都无法找到该对象,如果程序无法找到该对象,则程序无法销毁它)。 - Peter