【问题标题】:Vectors of std::shared_ptr Lose Datastd::shared_ptr 丢失数据的向量
【发布时间】:2011-06-06 22:38:15
【问题描述】:

我正在尝试构建std::shared_ptrsstd::vectorsstd::maps,但它们似乎有丢失数据的习惯。我的意思是,当我将std::shared_ptrs 推入它们时,其中一些会删除它们指向的数据。

具体来说,第一个被推入std::vectorstd::shared_ptr 被删除。这令人困惑,因为将std::shared_ptr 推入std::vector 应该增加引用计数,直到原始std::shared_ptr 超出范围,对吗?似乎没有其他std::shared_ptrs 被删除,但我无法检查直到我解决了这个问题,因为它通过迭代检查值。

如果我没有很好地解释自己,我深表歉意。我还在适应这个网站。

编辑:Here 是两个相关类的代码。问题应该出在 Load 成员函数上。它很大,因为它是一个文件解析器,所以我不知道问题出在哪里。 Value 是一个成员变量,对于 List 是 std::vector<std::shared_ptr<NBT::Tag::Base>>,对于 Compound 是 std::map<std::string, std::shared_ptr<NBT::Tag::Base>>

【问题讨论】:

  • 你能发布一个代码示例吗?我试图模仿你用 boost::shared_ptr 描述的内容,它似乎表现正确。
  • 我认为只需发布几行代码来声明您的 shared_ptr 并将其插入向量中就足够了。在为我们说明问题的同时尽量简化它——这将有助于我们为您提供帮助。
  • 第 42 行缺少的毛巾运算符会导致未定义的行为,从而导致您的指针自行删除。
  • @OniLink 您是否尝试过缩小问题范围?我有一种感觉,如果您尝试仅使用 5 行代码来重现您的问题,您会很快发现错误(并且它可能与将 shared_ptrs 插入向量中无关)。
  • @OniLink 通过valgrind 运行您的程序以定位段错误的来源。

标签: c++ c++11 vector shared-ptr delete-operator


【解决方案1】:

通过valgrind 运行您的程序以定位段错误的来源。

【讨论】:

  • “使用 valgrind”不是答案。
【解决方案2】:

你不能随便构造 shared_ptr 的,它们需要相互构造,否则它们认为它们是唯一拥有 shared_ptr 的对象,并在它们超出范围时删除对象。如果您希望能够直接从对象构造 shared_ptr,则需要从 enable_shared_from_this<Type> 继承。我无法轻松阅读您的代码(那里有很多),但在我看来,您的症状听起来像是您一直在误解它们。

【讨论】:

  • 那么从新语句创建 std::shared_ptr 行不通?因为我从新语句中构造了第一个 shared_ptr,其余部分是从该 shared_ptr 中复制的。
  • 好吧,我做了一些调试,发现不,这似乎不是 std::shared_ptrs 认为他们是唯一所有者的问题。我在可以删除它的各个位置使用了 use_count(通常是在 shared_ptr 即将超出范围时),并且它总是提供超过 1 个所有者,所以这不应该是问题。
  • @OniLink:真奇怪,这几乎是我唯一的想法。
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2013-09-07
  • 2011-07-15
  • 2020-03-09
相关资源
最近更新 更多