我正在像这样在堆上创建一个整数向量:std::vector<int> vec = *new std::vector<int>();
然后我进入程序的结尾,我需要释放内存,但是使用vec.clear()
不能释放内存。
如何正确执行此操作?
谢谢,祝一切顺利
-米切尔
最佳答案
如何正确执行此操作?
替换为:
std::vector<int> vec = *new std::vector<int>();
有了这个:
std::vector<int> vec;
问题解决了。
与您可能遇到的其他语言不同,在大多数情况下最好避免使用
new
。它像其他语言一样动态分配对象。但是与其他语言不同,C ++没有垃圾收集器,因此您需要手动销毁动态分配的对象。但是,按照编写代码的方式,您已经不可能做到这一点。您正在使用new动态分配对象,该对象将返回指向该对象的指针。然后,您将取消引用该指针(通过*),并将对象复制到
vec
。 vec
被正确销毁,但是从其复制的动态分配对象却没有。而且由于您没有存储该指针,所以您将无法访问该对象,也无法对其进行处理。为了销毁该对象,您将不得不捕获指针,如下所示:std::vector<int>* vec_pointer = new std::vector<int>();
然后,您可以在指针上调用delete,这会破坏对象并释放内存:
delete vec_pointer;
幸运的是,动态分配不是必需的,因为在其他语言中经常如此。声明对象会创建它,并且超出范围时会销毁它。因此,我向您展示的简单代码行就足够了,而无需删除语句。
附带说明一下,如果由于某种原因而确定必须具有动态分配。使用一个智能指针(谷歌那个)。