,所以我想有vector<OtherClassName> theVector
作爲的BaseClass
動態對象創建
我在很多方面,我可以得到一個內存泄漏想一員......
意願這樣做的結果內存泄漏?
BaseClass::someFunction(){
OtherClassName * c = new OtherClassName();
theVector.push_back((*c));
}
我是C++的初學者,從互聯網上學習。
,所以我想有vector<OtherClassName> theVector
作爲的BaseClass
動態對象創建
我在很多方面,我可以得到一個內存泄漏想一員......
意願這樣做的結果內存泄漏?
BaseClass::someFunction(){
OtherClassName * c = new OtherClassName();
theVector.push_back((*c));
}
我是C++的初學者,從互聯網上學習。
會這樣做會導致內存泄漏嗎?
是,這會導致內存泄漏。每個分配有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);
}
通過new
和delete
手冊內存管理被認爲是不好的編程習慣在現代C++,因爲它容易導致內存泄漏或不確定的行爲,並影響你的程序的設計方面堅固性,可讀性和易維護性。
謝謝,這有助於很多..你解釋_value語義_和_reference語義_的方式真的幫助我.. :) – jujiyangasli 2013-03-27 22:44:18
@jujiyangasli:好的,我很高興它幫助。如果您發現此問題可以解答您的問題,請考慮將答案標記爲已接受(或您可能更喜歡的其他答案)。並祝你的學習過程;-) – 2013-03-27 22:48:47
@sftrabbit:這只是感謝過度慷慨的OP誰決定獎勵我的賞金。除此之外,看起來你最近比我做得更好;) – 2013-03-28 00:13:07
動態創建任何東西的類應該有一個析構函數,當對象被銷燬時釋放內存。如果你沒有一個你有內存泄漏。任何由新語句取得的內存都必須具有相應的刪除語句,否則將發生內存泄漏。由於你的班級現在已經寫好了,因爲你再也沒有釋放內存,所以它會有內存泄漏。你的析構函數應該簡單地通過矢量並從存儲的每個指針中釋放內存。
如果您想學習C++,您可能需要閱讀[良好的C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。從互聯網上零散地學習C++是一個緩慢而容易出錯的過程。 – Blastfurnace 2013-03-27 19:34:50