回答
class Airport : public vector<Airline*>
一個向量沒有一個虛擬析構函數,所以從它繼承來讓你進入UB行爲。
試試這個:
class Airport
{
std::vector<std::unique_ptr<Airline>> airlines_; // notice std::unique_ptr
// ...
};
通過存儲的std ::的unique_ptr而不是原始指針,你不會有顯式刪除任何東西。如果(出於某種原因)你需要存儲原始指針,指針的刪除應該做這樣的:
Airport::~Airport() { // declare it in the class
std::for_each(airlines_.begin(), airlines_.end(),
std::default_delete<Airline>{});
}
+1我刪除了我的答案。使用智能指針是解決問題的最佳方法。 – kol
我懷疑它應該是'shared_ptr'。有很多航空公司爲多個機場提供服務;) – MSalters
很有可能 - 這取決於我想如何使用Airline實例。 – utnapistim
正如其他人所指出的那樣,Airport
不應vector
繼承。 Airport
應該包含一個vector
。那麼是誰擁有航空公司的問題,你是否想在Airport
被摧毀時銷燬航空公司?如果是的話,我建議無論是簡單的std::vector<Airline>
:
class Airport {
std::vector<Airline> airlines_;
//...
};
或者,如果你需要的多態性,即Airline
是特針對不同的航空公司一個基類我建議智能指針:
class Airport {
std::vector<std::unique_ptr<Airline)> airlines_;
//...
};
如果你真不」不想使用智能指針,你可以使用原始指針,然後小心在析構函數刪除:
class Airport {
std::vector<Airline*> airlines_;
public:
Airport(const Airport&) = delete; // not allowed
Airport& operator=(const Airport&); = delete; // not allowed
~Airport() {
for (auto airline : airlines) {
delete airline;
}
}
//...
};
如果你這樣做,你需要仔細考慮你想要什麼Airport
複製行爲所必須,因爲默認的拷貝構造函數和賦值運算符將不能正確地管理內存。作爲第一步,您可以通過'刪除'複製構造函數和賦值運算符來防止複製,如上所述。但是,我建議您一旦瞭解智能指針,就會使用它們,因爲大部分問題都會消失。
如果機場不擁有那麼航空公司裸指針或共享智能指針存儲載體和它留給誰擁有航空公司正確釋放內存。在我看來,Airline
可以在多個Airport
中運行,所以Airport
擁有Airline
是沒有意義的,因此應該有一個單獨的容器Airline
,但它取決於您的型號。
開始:繼承自std::vector
由於技術原因 (它沒有虛擬析構函數)是錯誤的。在你的情況下,它也似乎 錯域的原因:一個機場不 航空公司的序列。試想一個人在使用這些詞語的 現實世界中解釋AirportS
給你。你肯定會爭論這一點。
你有兩種方法。
使用值(std::vector<Airline>
)來規避此問題。如果你這樣做,你也應該定義一個合適的等號運算符operator==(const Airline&, const Airline&)
。
或
如果AirportS
真的應該指針存儲AirlineS
,你 需要了解的所有權。 Airport
是否真的擁有存儲在其中的 AirlineS
?如果是這樣,它應該在其生命週期的末尾 刪除它們。如果不是,他們應該繼續生活。在第一種情況下,有人需要照顧存儲和銷燬AirlineS
。
如果一個Airport
擁有並銷燬AirlineS
您需要確保您的 在您的實施中遵守三法則。
- 1. 從指針向量中釋放內存
- 2. 如何釋放C中由兩個指針指向的內存?
- 3. 如何釋放CvMat指針向量的內存?
- 4. 指向釋放對象的NSDrawer委託?
- 5. 如何確定我是否有指向釋放對象的指針?
- 6. 如果有其他對象指向它,Dispose可以釋放內存嗎?
- 7. 創建一個指向抽象對象的指針向量
- 8. 指向對象的指針向量 - 如何避免內存泄漏?
- 9. 向量含有矢量對象指針的最終指向同一對象
- 10. 2向量對象指向相同的分配內存
- 11. UIPopOverController指向一個UITableViewCell內的對象?
- 12. 如何釋放ACTUAL內存,而不僅僅是指向內存的指針?
- 13. 如何向Ocean聲明我的自定義域對象可以釋放內存?
- 14. C++矢量對象與指向對象的指針的向量
- 15. 存儲一個指向對象成員變量的指針
- 16. 如何釋放指向保存地址的指針的指針
- 17. Java,指向內存中同一對象的引用變量
- 18. 如何指定另一個對象來指向單個對象?
- 19. 釋放對象的內存
- 20. 如何釋放一個包含std :: vector的對象的內存
- 21. 如何創建一個類的對象向量的向量
- 22. 如何在iOS中正確釋放內存:內存永遠不會釋放;內存潛在泄漏指向
- 23. 如何更新對象內部的JavaScript指針以指向另一個對象?
- 24. 找到並返回一個指向一個向量中的對象的指針
- 25. 如何釋放指向堆中指向堆中其他對象的指針類型的指針指針類型?
- 26. C++刪除指向子類的指針時未釋放內存
- 27. C++:指向釋放內存空間的指針
- 28. 如何從內存釋放對象
- 29. 釋放分配給指針的內存vs釋放分配給指針指向的內存
- 30. 釋放對象內存中的對象
一個簡單的規則:永遠不會繼承像std類,向量,集,deque等... – Caduchon
你可以給更多的上下文嗎?從std :: vector繼承是遠遠不推薦。你有自己的矢量實現嗎? –
不知道你想要做什麼,把'vector'作爲'Airport'成員似乎更明智。 – Michael