如果已使用new
动态分配了程序的每个内存,那么最好在析构函数中对其进行分配。
#include <iostream>
using namespace std;
class c{
public:
c(){cout << "Created Object";}
~c(){
delete this;
cout << "Deleted object";
}
};
int main(){
c* ptr = new (nothrow) c();
if(ptr == NULL){
cout << "Null pointer" << endl;
return 1;
}
delete ptr;
}
delete this
完全不允许吗?this
指向使用new
分配的内存中的某个位置,那么为什么会导致segmentation fault
呢?我知道,代码对于存储在堆栈中的对象不是通用的,但是我正在尝试弄清是否有实现此概念的方法。
答案 0 :(得分:3)
delete
不是free
。让我在delete
上引用cppreference:
delete
表达式如果 expression 不是空指针...,则delete表达式将为要销毁的对象调用析构函数(如果有)。
此后,不管是否有析构函数引发异常,删除表达式都会调用释放函数:
operator delete
(对于表达式的第一个版本)...
因此,delete this;
中的~c()
将调用~c()
,最终将导致无限递归。通常,如果您知道自己在做什么,请delete this;
is allowed。
答案 1 :(得分:1)
删除这根本不允许吗?
它很少有用,但可以使用。
析构函数是永远不会有用的一种情况。删除调用析构函数。如果在调用析构函数的析构函数中调用析构函数,而析构函数又调用析构函数,而析构函数又调用析构函数,而析构函数又调用析构函数,而析构函数又调用了析构函数……这是一个问题。
答案 2 :(得分:1)
delete ptr;
删除对象。在析构函数中,delete this;
再次将其删除。仅这就是一场灾难,但是正如另一个答案所提到的,这导致析构函数被第二次调用,因此delete this;
会第三次删除该对象,这将无限次地调用析构函数(或直到堆栈溢出,无论哪个发生)首先)。