当前位置: 首页 > 面试题库 >

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

薛兴德
2023-03-14
问题内容

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

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 ++编译器


问题答案:

让我们将其与类似的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作为隐藏的隐式参数传递。



 类似资料:
  • 我遇到了我不明白的情况。有人能很好地解释为什么第一个代码编译正确,而第二个代码出错: 错误:“TestClass::z”的值在常量表达式中不可用。} - ^ 注意:“int TestClass::z”不是const static int z;" 工作代码: 但是当我尝试使 静态时,我得到上述错误: 附言:我正在使用mingw32-g 4.8.1

  • 我想在我的对象中编写一个实用函数指针,用于调用该对象中的一组其他函数。此实用程序函数指针应使用默认功能初始化,但也可以重写。 这就是我到目前为止所做的: 编译器不喜欢在捕获lambda函数时使用,并针对该行抛出以下错误: E0413-没有来自“lambda[]void()的合适转换函数- C2440“正在初始化”:无法从“游戏状态::”转换为“void(uu cdecl*)(void)” C243

  • 员函数调整客户的银行借贷(例如 BanLAccount 类的 private 数据成员)。 类通常提供 public 成员函数,让类的客户设置(写入)或读取(取得) private 数据成员的值。这些函数通常称为get和set。更具体地说,设置数据成员interestRate的成员函数通常称为setInterestRate,读取数据成员IntersetRate的值通常称为 getInterestR

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问

  • 当从基类派生出一个派生类时,派生类的成员函数可能需要访问基类的某些成员函数。 软件工程视点 9.2 派生类不能直接访问其基类的 private 成员。 这是 C++ 中关键的软件工程视点。如果派生类能访问其基类的 private 成员,那么就会破坏基类的封装性。隐藏 private 成员有助于测试、调试和正确地修改系统。如果派生类能访问其基类的 private 成员,那么从派生类派生出的类也应该能

  • 本文向大家介绍浅析成员函数和常成员函数的调用,包括了浅析成员函数和常成员函数的调用的使用技巧和注意事项,需要的朋友参考一下 在Coordinate类中,有一个Display()成员函数和一个Display() const常成员函数,代码如下 Display()成员函数和一个Display() const常成员函数是互为重载的,那么如果我们直接像下面这样调用该方法,会调用的是哪个呢? 那么运行下程序