c++ - 共享指针 vector ,清除 vector 后的内存问题

标签 c++ memory vector smart-pointers

我意识到在调用保存共享指针的vector.clear() 之后,shared_ptr 拥有的对象的析构函数没有被释放。

代码示例如下所示。即使 vector.clear() 被调用,在共享指针之后调用的析构函数也超出了范围。我的问题是 - 我是否必须通过重置它们来手动删除 vector 内的所有智能指针?有没有更简单的方法可以提供建议?

Output :   

constructor
I am here
destructor

Code:

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

using namespace std;

class A
{
public:
    A(){cout << "constructor" << endl;};
    ~A(){cout << "destructor"  << endl;};
};

int main( )
{
    shared_ptr<A> sharedptr (new A);
    std::vector<shared_ptr<A> > test;
    test.push_back(sharedptr);

    test.clear();
    cout << "I am here" << endl;
}

最佳答案

您有两份 shared_ptr<A>在这种情况下,一个是 sharedptr变量和另一个作为 vector 中的元素。

改为这样做

test.push_back(std::move(sharedptr));

现在请注意原始 sharedptr它的内部移动并且不再可用。另一件事是什么都不做,这是对 shared_ptr 和 sharedptr 的完全有效的用法。超出范围后会自行清理。

关于c++ - 共享指针 vector ,清除 vector 后的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334889/

相关文章:

c++ - 二维数组分配

c++ - 为什么这里没有省略复制构造函数?

c++ - 可移植显式预取

c - 内联汇编中的内存偏移量

java - Java中的内存主机和内存参数xms和xmx之间的关系

WebAssembly 中的内存限制

c++ - 我已经完成了 << 运算符重载,但它不起作用

c++ - 用 vector 编写算法的问题

c++ - "Normalize"使用 lambda 的 C++ 中的二维 vector

arrays - 如何将标量传递给 Fortran 子程序的向量(一维数组)?