微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在成员函数中使用“删除此”之后,我可以访问其他成员函数为什么?

如何解决在成员函数中使用“删除此”之后,我可以访问其他成员函数为什么?

让我们将其与类似的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在调试模式下将内存设置为预定义的模式,因此您可以在访问释放的内存时轻松发现。

为什么这与您的问题有关?因为编译器将其this作为隐藏的隐式参数传递。

解决方法

我只是编写了一个示例程序来查看 删除此文件* 的行为 *

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. 在fun()中执行 删除操作 后,如何在fun()中使用此指针访问func_2()?
  2. 现在主要在删除该指针时如何执行 obj- > fun_2
  3. 如果在杀死该对象后能够访问函数成员,那么为什么数据成员的数据为零‘0’?

m使用linux ubuntu和g ++编译器

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。