2014-03-28 42 views
3

例如:我有一個指向對象的向量。如何釋放內存?

class Airport : public vector<Airline*> 

如何正確釋放內存?我寧願不使用智能指針,因爲我還沒有在課程中學到它。

+6

一個簡單的規則:永遠不會繼承像std類,向量,集,deque等... – Caduchon

+0

你可以給更多的上下文嗎?從std :: vector繼承是遠遠不推薦。你有自己的矢量實現嗎? –

+1

不知道你想要做什麼,把'vector'作爲'Airport'成員似乎更明智。 – Michael

回答

0
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>{}); 
} 
+0

+1我刪除了我的答案。使用智能指針是解決問題的最佳方法。 – kol

+1

我懷疑它應該是'shared_ptr'。有很多航空公司爲多個機場提供服務;) – MSalters

+0

很有可能 - 這取決於我想如何使用Airline實例。 – utnapistim

4

正如其他人所指出的那樣,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,但它取決於您的型號。

+0

'vector'不能存儲引用。你至少需要一個'std :: reference_wrapper'。 – pmr

+0

@pmr:好點。固定。 –

+0

此外,您的具有原始指針的'Airport'類違反了三/五規則,並且一旦'Airport'類型的對象被分配或複製就會崩潰。 – pmr

0

開始:繼承自std::vector由於技術原因 (它沒有虛擬析構函數)是錯誤的。在你的情況下,它也似乎 錯域的原因:一個機場 航空公司的序列。試想一個人在使用這些詞語的 現實世界中解釋AirportS給你。你肯定會爭論這一點。

你有兩種方法。

使用值(std::vector<Airline>)來規避此問題。如果你這樣做,你也應該定義一個合適的等號運算符operator==(const Airline&, const Airline&)

如果AirportS真的應該指針存儲AirlineS,你 需要了解的所有權。 Airport是否真的擁有存儲在其中的 AirlineS?如果是這樣,它應該在其生命週期的末尾 刪除它們。如果不是,他們應該繼續生活。在第一種情況下,有人需要照顧存儲和銷燬AirlineS

如果一個Airport擁有並銷燬AirlineS您需要確保您的 在您的實施中遵守三法則。

相關問題