提问者:小点点

unique_ptr在自己的函数中赋值为nullptr


在下面的代码中,在函数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;
}

共2个答案

匿名用户

为什么没有出现分段故障异常?

如果代码中存在未定义的行为,它实际上没有定义代码的行为应该是什么,那么您不能“期望”代码的任何结果。

分段错误是操作系统发送给进程的信号,以防程序试图访问,读取或写入不允许的内存位置。 因为在执行过程中,您的程序没有这样做,所以您的程序没有收到分段错误。 即,您不能“期望”在mids中释放对象成员函数执行中的对象内存,这是一种未定义的行为,将导致分段错误。

匿名用户

您的类x是微不足道的。 它没有任何字段或虚拟方法,因此永远不会使用结果指针this

因此,当您在执行对象的方法时销毁该对象,不会发生什么坏事,因为在这段内存上没有执行任何操作。