我希望以下代码在进入方法内并打印任何内容之前会分割故障。为什么不呢?例如,执行如何进入方法内部并打印输出?
#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)
。由于method
是class Foo
的非virtual
方法,因此转化为Foo::method(0)
(将this
设置为nullptr
(。
输出线根本不引用this
,因此只有在访问m_list
时,this
才会首先进行(因此崩溃(。
如果method
是virtual
,那么对其的调用很可能会崩溃,就像在典型的实现中一样,呼叫virtual
方法deerference deReference this
。