Ints传染媒介在堆和释放记忆的

时间:2013-01-17 03:59:06

标签: c++ memory vector free

我正在堆上创建一个int的向量,如下所示:

std::vector<int> vec = *new std::vector<int>();

然后我到达我的程序结束,我需要释放内存,但使用vec.clear()不会释放内存。

我该如何正确地做到这一点?

谢谢,一切顺利 -Mitchell

2 个答案:

答案 0 :(得分:4)

  

我该如何正确地做到这一点?

替换它:

std::vector<int> vec = *new std::vector<int>();

有了这个:

std::vector<int> vec;

问题解决了。

与您可能遇到的其他语言不同,在大多数情况下最好避免使用new。它动态分配对象,就像在其他语言中一样。但与其他语言不同,C ++没有垃圾收集器,因此您需要手动销毁动态分配的对象。但是,你编写代码的方式,你已经做到了这一点。

您正在使用new动态分配对象,该对象返回指向该对象的指针。然后,您将取消引用该指针(通过*),并将对象复制到vecvec被正确销毁,但从中复制的动态分配对象却没有。而且由于你没有存储指针,你无法访问该对象,也无法处理它。为了销毁该对象,您必须捕获指针,如下所示:

std::vector<int>* vec_pointer = new std::vector<int>();

然后,你可以在指针上调用delete,它会破坏对象并释放内存:

delete vec_pointer;

值得庆幸的是,动态分配不是必需的,因为它通常在其他语言中。声明一个对象会创建它,当它超出范围时会被销毁。因此,我向您展示的简单代码就足够了,不需要删除语句。

作为旁注,如果您因某种原因确定必须进行动态分配。使用智能指针(google that)。

答案 1 :(得分:2)

您的程序正在泄漏内存。

std::vector<int> vec在堆栈上声明一个向量。您在堆上创建第二个(空)向量,并使用它来复制构造堆栈上的向量。由于它是空的,这实际上什么都不做。

但是,你已经丢失了指向堆上创建的向量的指针(因为你从未存储它)。因此您无法删除它,并且无法回收该内存。然而,堆栈上的向量在自身之后就可以清理了。

你可能想要的只是:

std::vector<int> vec;    // Vector on stack, no manual memory management required

如果你真的想出于某种原因使用堆(堆栈速度更快,矢量对象本身的固定大小很小,无论你放入多少元素,所以你不必担心溢出堆栈),你可以这样做:

// Declare pointer to vector, and initialize it with a new vector on the heap
std::vector<int>* vec = new std::vector<int>();

甚至(在C ++ 11中):

auto vec = new std::vector<int>();

然后,当你完成它:

delete vec;