[英]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.