c ++ vector new delete

k_z*_*r_k 0 c++ memory-leaks vector

我如何在下一个例子中释放mamory.vt.pop_back()删除vt中的元素,但它不释放内存.删除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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*sen 6

您没有存储"测试"对象,而是存储指向这些对象的指针.因此删除只会删除指针.

如果您希望将对象存储在矢量中,则应该输入类型

vector<Test>
Run Code Online (Sandbox Code Playgroud)

这样删除调用实际上运行对象的析构函数.

生成的代码变为:

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

如评论所述,这还需要一个新的复制构造函数:

Test::Test(const Test& t)
{
    arr = new int[SIZE];
    for(int i = 0; i != SIZE; i++)
        arr[i] = t.arr[i];
}
Run Code Online (Sandbox Code Playgroud)