我将类型定义为共享指针:typedef shared_ptr<Myclass> Sptr;
然后是一个向量:vector<Sptr> vectr
;
现在我在向量中存储了几个共享指针,每个都指向一个动态分配的内存。
现在我想删除vector中的特定元素(child)(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)将删除由共享指针内的指针动态分配和指向的内存。 (只有指向动态存储器的向量中的共享指针,即count为1)
提前致谢。
答案 0 :(得分:3)
是。如果共享指针的唯一实例是向量中的实例,则将其从向量中删除将导致该共享指针实例的析构函数运行。这将释放共享指针拥有的对象的相关内存。
如果你知道引用计数是一个...但是......
...使用共享指针的原因之一正是当某些东西是最后一个实例时,你不知道。如果你有那么多的知识......而这个载体是“拥有”的集合,那么考虑像std::unique_ptr
这样的替代品。答案 1 :(得分:1)
当删除shared_ptr
时,它会删除它所持有指针的对象,当且仅当它是持有指向该对象的指针的最后一个shapred_ptr
时。如果另一个shared_ptr
拥有指向该对象的指针,则该对象不会被删除。
从shared_ptr
删除vector
时,您会看到相同的行为。
示例代码:
#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()