为什么取消引用时不会出现段错误? unique_ptr

时间:2019-07-02 04:28:27

标签: c++ segmentation-fault unique-ptr

我希望下面的代码在进入方法内部并打印任何内容之前先进行分段错误。为什么不呢?执行如何进入方法内部并打印输出?

#include <memory>
#include <vector>
#include <iostream>

class Foo{
    public:
        void method(int x){
            std::cout << "wut" << std::endl;
            m_list.push_back(x);
        }
    private:
        std::vector<int> m_list;
};

int main()
{
    std::unique_ptr<Foo> example;
    example->method(0);
}

1 个答案:

答案 0 :(得分:0)

当然,正如其他人指出的那样,这是未定义的行为。

但是,在许多C ++实现中,这确实不会崩溃直到输出之后,因为NULL指针在此之前从未真正取消引用。

您的main本质上可以归结为reinterpret_cast<Foo *>(nullptr)->method(0)。由于methodvirtual的非class Foo方法,因此它转换为Foo::method(0)this设置为nullptr)。

输出行根本不引用this,因此只有在访问m_list时才首先取消引用this(并因此崩溃)。

如果methodvirtual,则对它的调用很可能会崩溃,因为在典型的实现中,对virtual方法的调用会取消引用this