2012-04-09 61 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