【问题标题】:how to delete a shared pointer value in vector如何删除向量中的共享指针值
【发布时间】:2015-01-03 20:40:33
【问题描述】:

我已将共享指针类型定义为:typedef shared_ptr<Myclass> Sptr;

然后是一个向量:vector<Sptr> vectr;

现在我已经在一个向量中存储了几个共享指针,每个都指向一个动态分配的内存。

现在我想删除向量中的特定元素(子项)(children.begin() 到 children.end())。

ItemList::iterator it = find(children.begin(), children.end(), child);
if (it != children.end())
{
    //delete it;
    it = children.erase(it);
}    

现在 children.erase(it),这将删除共享指针内的指针动态分配和指向的内存。 (只有向量中的共享指针指向动态内存,即计数为 1)

提前致谢。

【问题讨论】:

  • 你的意思是typedef shared_ptr<Myclass> Sptr;而不是typedef shared_ptr<Myclass*> Sptr;
  • @billz 对不起,它 typedef shared_ptr Sptr.
  • 谢谢.. 如果我喜欢下面的 vectr[index] = sharedPtr; 还有一件事索引处的旧值会被删除吗??

标签: c++ vector shared-ptr


【解决方案1】:

是的。如果共享指针的唯一实例是向量中的实例,则将其从向量中擦除将导致该共享指针实例的析构函数运行。这将为共享指针拥有的对象释放相关的内存。

如果你知道引用计数是一……但是……

...使用共享指针的原因之一正是您不知道什么时候是最后一个实例。如果你有这么多的知识......并且这个向量是“拥有”的集合,那么考虑像std::unique_ptr这样的替代品

【讨论】:

  • 谢谢.. 如果我喜欢下面的 vectr[index] = sharedPtr; 还有一件事索引处的旧值会被删除吗??
  • @Durga 您可以根据 C++ 工作原理的基础知识来推理答案。请记住,shared_ptr 实例只是一个对象……它是您可以自己编写的对象。它的实例占用一些内存并具有引用计数。如果不摆脱旧对象,就无法将新对象放入向量槽中,并且每次在 C++ 中“摆脱”事物时,都会运行一个析构函数。您没有移动或保留被覆盖的 shared_ptr 实例......所以您会说需要发生什么?
  • 之前是指针向量vector;然后在我的项目中,将对象删除为 delete vector[index] (将删除动态分配的内存),然后指向新值 vector[index] = newValue;现在我必须用共享指针替换相同的东西。我评论了 delete vector[index] 行,然后我只是做了 vector[index] = newSharedObj;这会删除旧记忆吗??
  • @Durga 您的 typedef 继续混淆问题。在此讨论中,您尚未在任何地方定义 ptr;你只定义了Sptr。计算机代码是精确的,这里的问答不是读心练习,所以如果您有问题,请尽可能使用精确度。但是,如果您使用基于 vector<Myclass*> 的代码,过去需要在删除向量之前显式删除 Myclass*,并将其转换为使用 vector<shared_ptr<Myclass>>,那么确实不需要删除。另请注意我关于通过 unique_ptr 进行所有权控制的建议。
【解决方案2】:

shared_ptr 被删除时,当且仅当它是最后一个拥有指向该对象的指针的shapred_ptr 时,它才会删除它所指向的对象。如果另一个shared_ptr 持有指向该对象的指针,则该对象不会被删除。

当您从 vector 中删除 shared_ptrs 时,您应该会看到相同的行为。

示例代码:

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

struct A
{
   ~A() {std::cout << "Came to ~A()\n";}
};

int main(int argc, char** argv)
{
   std::shared_ptr<A> ptr1(new A());
   std::shared_ptr<A> ptr2(new A());

   {
      std::cout << "In the nested scope\n"; 
      std::vector<std::shared_ptr<A>> ptrList;
      ptrList.push_back(ptr1);
      ptrList.push_back(ptr2);
   }

   std::cout << "Out of the nested scope\n"; 

   return 0;
}

输出:

In the nested scope
Out of the nested scope
Came to ~A()
Came to ~A()

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多