gpt4 book ai didi

c++ - 了解 C++ 中的删除运算符

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:46 25 4
gpt4 key购买 nike

考虑下面的代码:

#include <iostream>
#include <string>
using namespace std;

class A{
public:
int x;
public:
A(){x=0;}
void fun1(){
cout << "fun1 is called \n";
cout << "Address of this is " << this <<endl;
delete this;
}
void fun2()
{
cout << "fun2 called \n";
}
~A()
{
cout << "Object Destroyed" << endl;
}
};

int main()
{
A* ptr=new A;
cout << "Address of ptr is " << ptr <<endl;
ptr->fun1();
ptr->fun2();
return(0);
}

输出是:

$ ./TestCPP
Address of ptr is 0x20010318
fun1 is called
Address of this is 0x20010318
Object Destroyed
fun2 called

我的问题是,当我们在 fun1() 中调用 delete 时,它会破坏 this 指针指向的对象,即地址 0x20010318。它调用析构函数,如输出所示。因此在调用 fun1() 后,地址 0x20010318 处的对象被销毁,内存被释放。那为什么在输出中我们可以看到 fun2() 呢?这只是垃圾值(value)吗?我的意思是对象不存在但在 ptr -> fun2() 指向的位置 fun2() 的定义仍然存在?

也有人可以解释一下 delete 是如何工作的。比如调用new调用operator newconstructordelete操作是否类似?

谢谢

最佳答案

您所做的是技术上未定义的行为,所以实际上,就标准而言,任何事情都可能发生。

除此之外,您可以很容易地推断出您所看到的实际行为。 fun2 是一个非虚函数。编译器将在编译时解析对它的调用。当对象被销毁时,函数并没有被销毁。当您调用 ptr->fun2() 时,您的编译器只会调用该函数。由于该函数不依赖于任何成员数据,因此输出是完全可以预测的(尽管就标准而言,它不是)。

这是我在空指针上调用非虚拟成员函数的演示。显然这是错误的,但它打印的语句完全符合预期:http://ideone.com/pddnGt

这并不是说代码不错。你的代码中永远不应该有未定义的行为。在较低的优化级别上,出于调试目的,编译器可能会很好地检查此类事情并使用错误消息停止程序,或抛出异常。

关于c++ - 了解 C++ 中的删除运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17324832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com