【问题标题】:How to delete memory for std::unique_ptr stored in a vector如何删除存储在向量中的 std::unique_ptr 内存
【发布时间】:2013-06-28 06:07:03
【问题描述】:

我有一个带有 C++ DirectX 组件的 Windows Phone 8 C# 项目。在 C++ DirectX 项目中,我在头文件中定义了一个变量:

std::vector<std::shared_ptr<ParticleRenderer>> m_particleRenderer;

在我的 C++ 文件中,我将新元素添加到向量中,如下所示:

m_particleRenderer.push_back( std::unique_ptr<ParticleRenderer>(new ParticleRenderer(m_d3dDevice, m_d3dContext, m_renderTargetView, m_depthStencilView)) );

我想删除这段记忆,怎么删除呢?

谢谢

【问题讨论】:

    标签: c++11 windows-phone-8 directx stdvector unique-ptr


    【解决方案1】:

    shared_ptrs 被销毁时,如果没有其他shared_ptrs 引用这些对象,则shared_ptrs 拥有的对象将被删除(因此它们的内存将被释放)。在这种情况下,m_particleRenderer 中的每个 shared_ptrs 将在以下任一情况下被破坏:

    • 包含m_particleRenderer 的对象被破坏(假设它是对象的成员)。
    • shared_ptr 已从 m_particleRenderer 中删除。

    因此,如果拥有m_particleRenderer 的对象仍然存在,但它不再对m_particleRenderer 中的元素有任何用处,那么简单的m_particleRenderer.clear(); 将从vector 中删除所有shared_ptrs。每个删除的shared_ptr 都将被销毁。如果它是唯一拥有其ParticleRenderershared_ptr,那么ParticleRenderer 也将被破坏。否则ParticleRenderer 将继续存在,直到拥有它的最后一个shared_ptr 被销毁。

    【讨论】:

    • 我想删除所有使用的内存,因为我似乎有一些内存泄漏。那将是第一个选择,对吗?对于第二个选项,“删除内存”和“销毁它们”有什么区别?
    • @Lisa 我刚刚注意到m_particleRenderer 存储的是shared_ptr 而不是unique_ptr,但第一个选项很可能是您想要的。我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2012-08-25
    • 2015-12-14
    • 1970-01-01
    • 2015-04-30
    • 2016-12-10
    • 2017-10-27
    • 2018-07-12
    相关资源
    最近更新 更多