在成员函数使用“删除”后,我能够访问其他成员函数。 为什么?(After using '

2019-06-26 22:08发布

我只写了一个示例程序看到的删除行为

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

问题

  1. 在执行删除乐趣之后 (),怎么我可以用这个指针访问func_2()中的乐趣()?
  2. 现在,在主如何,我能做到obj-> fun_2因为这个指针被删除?
  3. 如果我能够查杀此对象后访问成员函数,那么为什么数据成员为零正在添加“0”?

使用Linux Ubuntu和克间++编译器

Answer 1:

我们来比较一下一个类似SZENARIO:

A *a= new A();  
func(a);  
delete a;  
func2(a);  

在我的示例编译器只是传递了一个指针来FUNC和FUNC2,如果它指向一个有效的对象也就没有在意。 所以,如果你func2(a)和FUNC2取消引用指针,这是不确定的行为。 如果内存被释放回操作系统和程序不能访问*一个了程序可能会崩溃。 通常情况下删除保存分配的内存,不传回的操作系统,所以访问*一个删除后不会给一个例外,只是返回任何值。 这可能是一个*先前的值,但它也可能取决于删除执行任何其他价值,取决于其他调用新之间进行delete a*a 。 MSVC例如设置存储器在调试模式下,从而当访问已释放的内存可以很容易地发现的预定义模式。

为什么这关系到你的问题? 由于编译器通过this作为隐藏,隐式参数。



Answer 2:

  1. 你看到的是未定义的行为:它可能工作,也可能会崩溃。
  2. 指针指向一个删除的实例 - 它是一个悬摆指针。
  3. 这是一个未定义的行为,以及:您可能会看到一个零或者垃圾值。

埃里克利珀提供了一个非常漂亮的“一书在酒店房间的桌子的抽屉”中的比喻他的回答一个有关指针的局部变量的函数返回之后的问题,它是在这里同样适用。



文章来源: After using 'delete this' in a member function I am able to access other member functions. Why?