与unique_ptr混淆

时间:2014-11-23 15:54:14

标签: c++ memory-management unique-ptr

我希望以下代码在运行时因空指针错误而崩溃:

#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

2 个答案:

答案 0 :(得分:2)

您实际上是使用无效的对象参数调用成员函数 - 通常认为这会触发未定义的行为。但是,您没有在成员函数中使用this,因此实际上不会出现Segfaults。

尝试添加成员并在echo中访问该成员。那会破坏你的程序。即。

struct Foo
{
    int i;
    void echo() {std::cout << i << std::endl;}
};

答案 1 :(得分:0)

通过NULL指针调用成员函数肯定是一个未定义的行为。

您对该成员函数的调用是成功的,因为您没有使用此指针。