我希望下面的代码在进入方法内部并打印任何内容之前先进行分段错误。为什么不呢?执行如何进入方法内部并打印输出?
#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);
}
答案 0 :(得分:0)
当然,正如其他人指出的那样,这是未定义的行为。
但是,在许多C ++实现中,这确实不会崩溃直到输出之后,因为NULL
指针在此之前从未真正取消引用。
您的main
本质上可以归结为reinterpret_cast<Foo *>(nullptr)->method(0)
。由于method
是virtual
的非class Foo
方法,因此它转换为Foo::method(0)
(this
设置为nullptr
)。
输出行根本不引用this
,因此只有在访问m_list
时才首先取消引用this
(并因此崩溃)。
如果method
是virtual
,则对它的调用很可能会崩溃,因为在典型的实现中,对virtual
方法的调用会取消引用this
。