2013-03-27 212 views
2

,所以我想有vector<OtherClassName> theVector作爲的BaseClass動態對象創建

我在很多方面,我可以得到一個內存泄漏想一員......

意願這樣做的結果內存泄漏?

BaseClass::someFunction(){ 
    OtherClassName * c = new OtherClassName(); 
    theVector.push_back((*c)); 
} 

我是C++的初學者,從互聯網上學習。

+0

如果您想學習C++,您可能需要閱讀[良好的C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。從互聯網上零散地學習C++是一個緩慢而容易出錯的過程。 – Blastfurnace 2013-03-27 19:34:50

回答

1

會這樣做會導致內存泄漏嗎?

,這會導致內存泄漏。每個分配有new的對象必須使用delete銷燬。不這樣做會導致內存泄漏。

尤其是,您在此向量中存儲的是副本,其中分配的對象爲new。如果你希望你的容器,以便容納某一類對象,就足以做到:

BaseClass::someFunction() 
{ 
    OtherClassName c; 
    theVector.push_back(c); 
} 

注意,vector,就像標準庫的C++的所有容器,具有值語義:這意味着什麼你在向量中插入的是你傳遞給push_back()的對象的拷貝。對原始對象的進一步修改不會被向量中包含的對象的狀態反映,反之亦然。

如果你想要這個,如果你需要引用語義發生,即你必須讓你的載體包含(可能是聰明)指針。例如:

#include <memory> 

// theVector would be declared as: 
// std::vector<std::shared_ptr<OtherClassName>> theVector; 

BaseClass::someFunction() 
{ 
    std::shared_ptr<OtherClassName> pC = std::make_shared<OtherClassName>(); 
    theVector.push_back(pC); 
} 

通過newdelete手冊內存管理被認爲是不好的編程習慣在現代C++,因爲它容易導致內存泄漏或不確定的行爲,並影響你的程序的設計方面堅固性,可讀性和易維護性。

+0

謝謝,這有助於很多..你解釋_value語義_和_reference語義_的方式真的幫助我.. :) – jujiyangasli 2013-03-27 22:44:18

+0

@jujiyangasli:好的,我很高興它幫助。如果您發現此問題可以解答您的問題,請考慮將答案標記爲已接受(或您可能更喜歡的其他答案)。並祝你的學習過程;-) – 2013-03-27 22:48:47

+0

@sftrabbit:這只是感謝過度慷慨的OP誰決定獎勵我的賞金。除此之外,看起來你最近比我做得更好;) – 2013-03-28 00:13:07

0

動態創建任何東西的類應該有一個析構函數,當對象被銷燬時釋放內存。如果你沒有一個你有內存泄漏。任何由新語句取得的內存都必須具有相應的刪除語句,否則將發生內存泄漏。由於你的班級現在已經寫好了,因爲你再也沒有釋放內存,所以它會有內存泄漏。你的析構函數應該簡單地通過矢量並從存儲的每個指針中釋放內存。