2012-04-09 89 views
0

在下一個例子中,我如何釋放內存。 vt.pop_back()刪除vt中的元素,但它不釋放內存。 刪除vt [i]不起作用,它給我分段錯誤。C++ vector new delete

#include <vector> 
#include <unistd.h> 

using namespace std; 

const int SIZE = 1000000; 

class Test 
{ 
public: 
    Test(); 
    ~Test();  
private: 
    int *arr;  
}; 


int main() 
{ 
    vector<Test *> vt; 
    for(int i = 0; i < 100; i++) 
     vt.push_back(new Test()); 
    sleep(10); 
    return 0;  
} 


Test::Test() 
{ 
    arr = new int[SIZE]; 
} 


Test::~Test() 
{ 
    delete[] arr; 
} 
+3

爲什麼你甚至使用新的? – 2012-04-09 10:14:59

+0

爲什麼'刪除v [i]'不起作用?這段代碼中沒有'delete v [i]'。 – 2012-04-09 10:16:28

+0

,因爲構造函數可能包含參數 – 2012-04-09 10:16:42

回答

5

您不存儲「Test」對象,您正在存儲指向這些對象的指針。所以刪除只會刪除指針。

如果你希望你的對象存儲在矢量你應該做的類型

vector<Test> 

這樣,刪除通話實際運行對象的析構函數。

產生的代碼變成:

int main() 
{ 
    vector<Test> vt; 
    for(int i = 0; i < 100; i++) 
     vt.push_back(Test()); 
    sleep(10); 
    return 0; 
} 

正如評論,這也需要一個新的拷貝構造函數:

Test::Test(const Test& t) 
{ 
    arr = new int[SIZE]; 
    for(int i = 0; i != SIZE; i++) 
     arr[i] = t.arr[i]; 
} 
+1

別擔心,我不會偷任何東西;)隨時都會發生:我花了很長時間發佈答案並最終刪除它,因爲已經有類似的答案了:)請+1。 – 2012-04-09 10:24:47

+0

@ R.MartinHoFernandes:我知道,特別是在像這樣的問題上。很多人在minuts中回答 - 他們大多數基本上都有相同的答案:) – 2012-04-09 10:26:30

+1

但是矢量 vt; (int i = 0; i <100; i ++) \t vt.push_back(Test());不起作用 – 2012-04-09 10:27:20

4

您可以使用delete vt[i]這樣,它會釋放分配給Test對象存儲:

for(size_t i = 0; i < vt.size(); ++i) 
{ 
    delete vt[i]; 
} 
vt.clear(); 
1

您正在存儲指針並且沒有T對象,爲此該「指針對象」將被破壞,如果你摧毀你的載體而不是對象的指針指向

0

如果你想刪除特定的元素,你可以嘗試使用功能的std::vectorerase