我正在像这样在堆上创建一个整数 vector :
std::vector<int> vec = *new std::vector<int>();
然后我到了程序的末尾,我需要释放内存,但是使用 vec.clear()
不会释放内存。
如何正确执行此操作?
谢谢,祝一切顺利 -米切尔
最佳答案
How do I do this properly?
替换这个:
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;
值得庆幸的是,动态分配并不像其他语言那样是必需的。声明一个对象会创建它,当它超出范围时会被销毁。所以我向您展示的简单代码行就足够了,不需要 delete 语句。
附带说明一下,如果您出于某种原因确定必须进行动态分配。使用智能指针(谷歌那个)。
关于c++ - 堆上整数 vector 和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372003/