c++ - 与 unique_ptr 混淆

标签 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

并且 assert 没有触发,所以 up.get()nullptr

最佳答案

您实际上是在调用一个带有无效对象参数的成员函数——这通常被认为会触发未定义的行为。但是,您没有在成员函数中使用 this,因此实际上应该不会发生段错误。

尝试添加一个成员并在 echo 中访问该成员。那应该使您的程序崩溃。即

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

关于c++ - 与 unique_ptr 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090902/

相关文章:

c++ - 使用模板生成 const 和 non-const 相同的方法?

ruby-on-rails - 如果我创建一个 ruby​​ 对象会消耗多少内存?

c++ - 将内存分配给一个指针,将另一个指针指向同一个指针并删除第二个

c++ - 我可以将智能指针与互斥锁成员一起使用吗?

C++14 不能调用从唯一指针继承的类的复制构造函数或运算符=

c++ - std::sort 可以专门使用 as-if 规则对 int* 使用冒泡排序吗?

python - 循环次数影响效率(解释语言还是编译语言?)

c++ - 如何扫描 N 个字符串(使用结构)然后反向输出该字符串列表?

c++ - 智能指针和派生类

c++ - 未调用 std::unique_ptr 中的自定义删除器