2016-07-06 139 views
0

我是新的cpp.I定義了一個向量與此代碼,並在最後,我想完全擦除它。C++,刪除向量

#include <string> 
#include <stdio.h> 
#include <vector> 
#include <iostream> 
using namespace std; 


struct MCLASS 
{ 
    string *a = new string(); 
    string *b = new string(); 

    MCLASS(string ax,string bx) 
    { 
     a = new string(ax); 
     b = new string(bx); 
    } 

    ~MCLASS() 
    { 
     delete a; 
     delete b; 
    } 
}; 

vector<MCLASS*> *vc = new vector<MCLASS*>; 




int main() 
{ 
    for (int i = 0 ; i <= 1000000 ; i++) 
     vc->push_back(new MCLASS("EHEM","UHUM")); 

    for (int i = 0 ; i <= 1000000 ; i++) 
     delete vc->at(i); 

    vc->clear(); 
    delete vc; 
    cout<<"Deleted"; 
    cin.get(); 

    return 0; 
} 

但有一個疑難問題無法抹去它completely.I試圖刪除向量,向量明確項目的每個項目,並刪除它。但是當我檢查這個應用程序的內存使用,它使用約130MB.Please向我解釋做什麼。謝謝!

+4

您需要閱讀操作系統的內存模型。總之:大部分時間競技場並沒有減少到有更好的表現。 – VladimirS

+1

您不應該使用所有這些指針...... – Jarod42

+1

您可以通過不使用* raw指針*並聲明不帶'new'的變量來減輕這些指針問題。如果你*必須*使用指針使用*智能指針*。 –

回答

2

您對每個成員變量調用new string兩次。對於每一個,第二次調用new string的結果會覆蓋第一個的結果,所以第一個結果永遠不會得到deleted,並且存在內存泄漏。

不要在ab的聲明中調用new string - 只能在構造函數中使用。

struct MCLASS 
{ 
    string *a; 
    string *b; 
... 
+2

或者更好的是,使用一個成員變量:struct MCLASS {string a,b; MCLASS(字符串ax,字符串bx){a = ax; b = bx; } ....}' – majk

+0

majk是對的,當然沒有實際需要顯式地分配堆內存。更好的做法(不僅僅是因爲它有助於避免泄漏)直接使用容器對象,而不是指向它們的指針。但是,如果每個'new'都由一個'delete'平衡,那麼這不是你報告的問題的根源。 – jez

+0

是的,你是對的,我錯了。謝謝你的回答。 –

0

如果你想刪除一個std::vector的所有內容,您可以調用的clear成員函數或resize它的大小爲零。

結果稍有不同。 clear將銷燬所有元素,但可能會保留向量容量。 resize(0)將銷燬所有元素,並將容量減少到零。

+0

如果包含指針會導致內存泄漏,它不會在其成員上調用delete。 – majk

+2

我會爭辯說,如果它包含指針並且想要它們被刪除(如,vector *擁有*指針),那麼vector *應該*已經持有智能指針,這就是您應該修復的錯誤。 –

+1

你完全正確。只是爲了完整性而想包括它。 – majk

0

你的錯誤發生在10-11行:

string *a = new string(); 
string *b = new string(); 

事實上,你創建兩個指針一個b,你分配記憶對他們來說,記憶你」將永遠不會免費,因爲您在構造函數中重新分配新的內存而不檢查值。

有道解決這個問題(和良好做法)是初始化指針屬性NULL。在你的情況下更換這些線路這樣的:

string *a = NULL; 
string *b = NULL; 

然後,在構造函數或分配的地方吧...

提示

  • 一個或之前刪除,檢查當前值;)
  • 使用Valgrind的或類似的工具來檢查內存泄漏
2

從CPLUSPLUS。COM的articlevector::clear

重新分配並不一定會發生的,和矢量能力不能保證因調用此函數改變。強制再分配的典型方法是使用交換: vector<T>().swap(x); // clear x reallocating

由於VladimirS在他的評論中建議;內存管理不是一個簡單的野獸,但是如果沒有阻止替換刪除(如一些內存檢查工具),上面的內容應該會減少內存消耗。

+0

是的,但在這種情況下,錯誤不在這裏。我發佈了一個解釋他錯誤的答案。 @Alexei Barnes – N0un

+0

@ N0un這是真的,但這個問題形成不好,實際上有幾個問題,我已經回答了一部分,這個答案解決了問題的另一方面。 –

+0

是的,你的文章很有趣! – N0un