【问题标题】:Double free error using shared_ptr in C++ [duplicate]在 C++ 中使用 shared_ptr 的双重释放错误 [重复]
【发布时间】:2019-12-16 10:42:12
【问题描述】:

我知道这是一个很常见的问题,但我不理解相关问题中的代码示例(工作时间太长,太复杂)。所以,这是我的简单代码 sn-p:

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

int main(){
  vector<int> v({1,2,3,4,5});                 
  shared_ptr<vector<int>> v_ptr(&v);

  cout << (*v_ptr)[2] << endl;

}

现在,这个简短的 sn-p 会造成内存泄漏。我认为这是由于在破坏 shared_ptr 之前破坏了向量造成的。但是,我不明白如何相应地销毁指针。简单地尝试 reset() 是行不通的,那我该怎么办,为什么会出现内存泄漏?

请不要问我为什么需要这样做,我是智能指针的新手,并试图了解如何使用它们。这个例子与我的工作无关,但是,我想避免将来发生内存泄漏,所以这个问题实际上可能会有所帮助。提前致谢!

【问题讨论】:

  • “这个简短的 sn-p 造成了内存泄漏”——是什么让你这么认为?
  • @tzaman 我对此表示怀疑,您链接的问题技术性很强,理解答案肯定需要对 C++ 有更深入的了解。
  • @KonradRudolph 这正是这里介绍的情况 - 为堆栈对象创建 shared_ptr 是问题所在,那里的答案概述了一些不同的解决方案(使用空删除器,或 make_shared,或new 而不是堆栈分配)。对于试图了解为什么会出现问题的人来说,通读它会很有价值。
  • @tzaman 问题可能是相同的(或足够相似),但答案是针对截然不同的受众。完全不适合OP。
  • @KonradRudolph 那里的几个答案非常清楚,尤其是 Pete Becker,还有其他几个;即使是接受的我也不会称之为“太先进”。 OP 开始使用智能指针,此时学习对象所有权和生命周期变得必要,而不是深奥,因为管理这些是它们的全部目的。我不想对 OP 缺乏能力做出假设,特别是当他们表示有学习的愿望时。

标签: c++ shared-ptr


【解决方案1】:

因为shared_ptr在对象没有更多引用时调用delete(除非您使用删除器使其执行其他操作),所以它只能用于分配有new(或@987654324)的对象@,它调用new)。

v 未与 new 一起分配,因此您不应将其与 shared_ptr 一起使用。

【讨论】:

    【解决方案2】:

    向量v 是分配在堆栈上的对象。因此,当它超出范围时,它会自动销毁。当您将其地址提供给智能指针时,它会在指针超出范围时尝试将其删除。所以你有两个免费的。

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多