【问题标题】:Confusion with unique_ptr [duplicate]与unique_ptr混淆[重复]
【发布时间】:2014-11-24 00:00:46
【问题描述】:

我希望以下代码在运行时崩溃并出现空指针错误:

#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

【问题讨论】:

  • UB 就是 UB,你不应该期待什么。
  • 如何在 nullptr 上调用方法?
  • 终于又找到了副本。
  • @Deduplicator 干得好 :)
  • 顺便说一句:unique_ptr 是您问题中的红线。

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


【解决方案1】:

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

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

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

【讨论】:

  • 错误较早,见重复。
  • 哥伦布,有道理,谢谢!
  • @Deduplicator 你是什么意思?取消引用空指针? dyp 另有说法。前段时间我自己也使用过同样的论据。
  • @Columbo:Dyp 说在 C++ 中取消引用空指针 可以吗?他的论点在哪里,又是什么?我希望这不是“它似乎有效”。因为我会非常对任何允许取消引用空指针的东西感兴趣,尤其是因为它打破了引用总是代表一个对象的保证。
  • 取消引用空指针会产生一个左值。本身没有创建参考。我会在我们讨论过的地方找到评论。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2023-03-12
    • 2014-08-23
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多