0

在下一个示例中我如何释放内存。vt.pop_back() 删除 vt 中的元素,但不会释放内存。delete vt[i] 不起作用,它给了我分段错误。

#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;
}
4

4 回答 4

6

您不是在存储“测试”对象,而是在存储指向这些对象的指针。所以 delete 只会删除指针。

如果您希望将对象存储在向量中,则应设置类型

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];
}
于 2012-04-09T10:16:32.857 回答
4

你可以delete vt[i]这样使用,它会释放分配给Test对象的内存:

for(size_t i = 0; i < vt.size(); ++i)
{
   delete vt[i];
}
vt.clear();
于 2012-04-09T10:17:06.717 回答
1

您存储的是指针而不是对象,因此如果您销毁向量而不是指针指向的对象,则“指针对象”将被销毁

于 2012-04-09T10:17:24.713 回答
0

如果要删除特定元素,可以尝试使用erase.std::vector

于 2012-04-09T10:20:09.053 回答