我希望以下代码在运行时因空指针错误而崩溃:
#include <memory>
#include <iostream>
#include <cassert>
struct Foo {
void echo() {std::cout << "Echo" << std::endl;}
};
int main()
{
std::unique_ptr<Foo> up(new Foo());
up.reset(nullptr);
assert(up.get() == nullptr);
up.get()->echo();
}
然而gcc(4.7 / 4.8 / 4.9),msvc(2013年和即将到来的2015年)和clang(3.5)都很高兴地输出:
Echo
并且断言未触发,因此up.get()
为nullptr
。
答案 0 :(得分:2)
您实际上是使用无效的对象参数调用成员函数 - 通常认为这会触发未定义的行为。但是,您没有在成员函数中使用this
,因此实际上不会出现Segfaults。
尝试添加成员并在echo
中访问该成员。那会破坏你的程序。即。
struct Foo
{
int i;
void echo() {std::cout << i << std::endl;}
};
答案 1 :(得分:0)
通过NULL指针调用成员函数肯定是一个未定义的行为。
您对该成员函数的调用是成功的,因为您没有使用此指针。