簡體   English   中英

刪除矢量類成員

[英]Delete vector class member

我有一個帶有成員的A類,它是另一個B類的對象指針的向量

class A
{
    std::vector<B*> m_member_A

通過使用new運算符創建B的對象來填充m_member_A

B* b1 = new B;
m_member_A.push_back(b1);

在A的析構函數中,以下是否正確釋放所有內容?

A::~A()
{
    for(int i = 0; i < m_member_A.size(); ++i)
    {
        delete m_member_A[i];
    }

    m_member_A.clear();
}

這是正確的,只要你還有一個正確的復制構造函數和復制賦值運算符,每三個規則 請注意, clear()是多余的,因為向量的析構函數將釋放其內存。

你為什么亂搞指針和new 為什么不遵循Zero規則,如果需要指向多態的指針,請使用vector<B>vector<unique_ptr<B>> 那么你根本不需要擔心析構函數,復制構造函數或復制賦值運算符; 你將獲得移動語義作為獎勵。

是的,這是正確的......但還不夠。

每當復制A時,您還需要對容器進行深層復制。

如果你可以在向量中使用智能指針,那就更好了。 在你的頭腦和你的代碼中明確誰擁有什么。

幾乎

如果在A的構造函數中構造(分配)B的元素,並且某些B拋出異常,則會發生內存泄漏(除非它在A的構造函數中被捕獲,其中B的刪除已完成)

而通常的三條規則。

可能有一些插圖(請將MAKE_FAILURE調整為0或1):

#include <iostream>
#include <stdexcept>
#include <vector>

#define MAKE_FAILURE 0

static unsigned count;
const unsigned ExceptionThreshold = 3;
struct B {
    B() { if(ExceptionThreshold <= count++) throw std::runtime_error("Sorry"); }
    ~B() { std::cout << "Destruct\n"; }
};

struct A
{
    std::vector<B*> v;
    A()
    {
        for(unsigned i = 0; i < ExceptionThreshold + MAKE_FAILURE; ++i)
            v.push_back(new B);
    }

    ~A()
    {
        for(unsigned i = 0; i < v.size(); ++i) {
            delete v[i];
        }
    }
};

int main()
{
    A a;
    return 0;
}

你也可以進入淺層和深層復制的地形(如Orb的@Lightness Races所述)

這是在m_member_A向量中釋放動態分配對象的內存的正確方法。 你實際上不需要打電話:

m_member_A.clear();

std :: vector將自己釋放內存。

如果您可以使用C ++ 11,那么我建議更改為shared_ptr:

  std::vector<std::shared_ptr<B>> m_member_A

現在你不需要自己釋放記憶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM