簡體   English   中英

我需要刪除載體嗎?

[英]Do I need to delete a vector?

我將向量定義為Grid類的私有變量。 類積分只有兩個實例變量,它們都是整數,但是只有從文件中讀取積分時才知道積分的數量,所以我想我必須用新的動態制作積分,這意味着以后必須銷毀它們。 我是否正確初始化了構造函數,並且在為Grid編寫析構函數時是否需要為向量編寫析構函數,例如:〜vecotr()或使用delete或使用迭代器?

class Grid{
public:
  // initialize vector with 3 points with val 0.
  Grid(vector<Points> v) : vector<Points>(3, 0) {};  // is this right


// first option
  ~Grid() {
    ~vector<Points>();  // not sure how to destroy vector<Points>;
  }

// second option
  ~Grid() {
     delete v_points;
  }

// third option
  ~Grid() {
     for (vector<Points>::iterator it = v_points.begin(), 
          vector<Points>::iterator it_end = v_points.end(); it != it_end; it++)
  }

private:
  vector<Points> v_points;
};

我應該使用哪個選項?是否正確初始化了構造函數?

如果沒有使用new分配對象,則無需顯式銷毀它。 成員對象將按照其聲明的相反順序自動銷毀。 在您的情況下,甚至不需要創建析構函數,因為自動析構函數就足夠了。

如果由於某種原因確實為成員對象分配了new,則還必須創建自定義副本構造和賦值運算符,否則會遇到在多個實例之間共享同一成員對象的麻煩。

我會回答,因為在您提出更多問題時,前任僅回答了主題中的問題,我也會提供一些建議。 在本文的其余部分中,我們將假定如果Points確實分配了任何動態內存,則刪除Points會正確返回該內存。

類積分只有兩個實例變量,它們都是整數,但是只有從文件中讀取積分時才知道積分的數量,所以我想我必須用新的動態制作積分,這意味着以后必須銷毀它們。

這與您實際上在這里所做的矛盾

class Grid{
public:
  // initialize vector with 3 points with val 0.
  Grid(vector<Points> v) : vector<Points>(3, 0) {};  // is this right

private:
  vector<Points> v_points;
};

因為您創建的向量沒有new 但是,如果我們假設您首先獲得Points ,然后您將要創建網格,則這可能是可以的。 std::vector不是C數組,可以輕松調整大小,分配並提供更大的靈活性。 您不必在堆上創建它,因為您擔心大小:向量元素總是在堆上創建,它只是一個向量本身(如果存在)在堆棧上。 這通常正是我們想要的(請參見RAII )。 然后初始化向量的正確方法是

class Grid{
    public:
      // initialize vector with 3 Points with val Points(0)
      Grid(vector<Points> v) : v_points(3, Points(0)) {};

    private:
      vector<Points> v_points;
};

注意,我們在初始化列表中進行操作。 對於POD類成員,這沒有什么區別,這只是樣式問題。 對於屬於類的類成員,則可以避免不必要地調用默認構造函數。

我是否正確初始化了構造函數,並且在為Grid編寫析構函數時是否需要為向量編寫析構函數,例如:〜vecotr()或使用delete或使用迭代器?

您不初始化構造函數,而是在構造函數初始化列表中初始化類成員。 由於vector沒有分配給new ,因此您將不會delete它(調用delete )。 銷毀Grid時,它將自動銷毀。

// fourth (and correct) option:
~Grid() {
}

或者只是完全銷毀析構函數; 編譯器生成的析構函數將在此處執行正確的操作。

如果使用new創建對象,則必須將其刪除。 如果不這樣做,就一定不要。

我假設Points沒有任何動態分配的內存。 如果是這種情況,那么您所需要做的就是

~Grid() { }

如果是這樣,則需要刪除向量中每個項目的動態分配內存(或使用智能指針)。

暫無
暫無

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

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