在下面的代码中,在函数makenull中,当我尊重自己的unique_ptr时,调用对象的析构函数,这很好。 现在,即使在析构函数完成后,makenull函数如何仍然得到执行和打印“空后”为什么不分段错误异常来?
#include <iostream>
#include <memory>
using namespace std;
class X{
public:
~X(){
cout<<"In destructor of X\n";
}
void makenull(std::unique_ptr<X> ptr){
cout<<"before null\n";
ptr = nullptr;
cout<<"after null\n";
}
};
int main()
{
cout<<"Hello World\n";
std::unique_ptr<X> x = std::make_unique<X>();
x->makenull(std::move(x));
cout<<"In main......";
return 0;
}
为什么没有出现分段故障异常?
如果代码中存在未定义的行为,它实际上没有定义代码的行为应该是什么,那么您不能“期望”代码的任何结果。
分段错误是操作系统发送给进程的信号,以防程序试图访问,读取或写入不允许的内存位置。 因为在执行过程中,您的程序没有这样做,所以您的程序没有收到分段错误。 即,您不能“期望”在mids中释放对象成员函数执行中的对象内存,这是一种未定义的行为,将导致分段错误。
您的类x
是微不足道的。 它没有任何字段或虚拟方法,因此永远不会使用结果指针this
。
因此,当您在执行对象的方法时销毁该对象,不会发生什么坏事,因为在这段内存上没有执行任何操作。