为什么在解雇方面没有seg缺陷?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);
}

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

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

您的main基本上归结为reinterpret_cast<Foo *>(nullptr)->method(0)。由于methodclass Foo的非virtual方法,因此转化为Foo::method(0)(将this设置为nullptr(。

输出线根本不引用this,因此只有在访问m_list时,this才会首先进行(因此崩溃(。

如果methodvirtual,那么对其的调用很可能会崩溃,就像在典型的实现中一样,呼叫virtual方法deerference deReference this

相关内容

  • 没有找到相关文章

最新更新