我只是编写了一个示例程序来查看 删除此文件* 的行为 *
class A { ~A() {cout << "In destructor \n ";} public: int a; A() {cout << "In constructor \n ";} void fun() { cout << "In fun \n"; delete this; cout << this->a << "\n"; // output is 0 this->fun_2(); // how m able to call fun_2, if delete this is called first ?? } void fun_2() { cout << "In fun_2 \n"; } main() { A *ptr = new A; ptr->a = 100; ptr->fun(); //delete this will be executed here ptr->fun_2(); //how m able to execute fun_2 when this pointer is deleted ?? cout<< ptr->a << "\n"; //prints 0 return 0; } > Output In constructor In fun In destructor 0 In fun 2 In fun 2 0
问题
m使用linux ubuntu和g ++编译器
让我们将其与类似的szenario进行比较:
A *a= new A(); func(a); delete a; func2(a);
在我的示例中,编译器只是将指针a传递给func和func2,它不在乎是否指向有效对象。因此,如果您调用func2(a)并且func2取消引用指针,则这是未定义的行为。如果将内存释放回操作系统,并且该程序无法再访问 a,则该程序可能会崩溃。通常,删除会保留分配的内存,不会将其传递回操作系统,因此删除后访问 a不会给出异常,而只是返回任何值。这可能是* a的先前值,但也可能是任何其他值,这取决于delete的实现以及取决于在delete a和之间对new的其他调用*a。例如,MSVC在调试模式下将内存设置为预定义的模式,因此您可以在访问释放的内存时轻松发现。
func2(a)
delete a
*a
为什么这与您的问题有关?因为编译器将其this作为隐藏的隐式参数传递。
this