c++ - 堆上整数 vector 和释放内存

标签 c++ memory vector free

我正在像这样在堆上创建一个整数 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 动态分配一个对象,它返回一个指向该对象的指针。然后您将取消对该指针的引用(通过 *),并将该对象复制到 vecvec 被正确销毁,但从中复制它的动态分配对象却没有。由于您没有存储该指针,因此您无法访问该对象,也无法处置它。为了销毁该对象,您必须像这样捕获指针:

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

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

delete vec_pointer;

值得庆幸的是,动态分配并不像其他语言那样是必需的。声明一个对象会创建它,当它超出范围时会被销毁。所以我向您展示的简单代码行就足够了,不需要 delete 语句。

附带说明一下,如果您出于某种原因确定必须进行动态分配。使用智能指针(谷歌那个)。

关于c++ - 堆上整数 vector 和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372003/

相关文章:

c++ - 如何检查 std::array 已声明但未显式初始化

windows - Windows 任务管理器和任务列表中显示不同的内存使用情况

java - 你能在 Java 中原生地进行 vector 加法吗?

c++ - push_back 对象引用

c++ - 重复使用 prefix++ 运算符时的未定义行为

c++ - 从 Boost 库 C++ 循环创建图形

javascript - 使用 Angular 的 $compile 和新范围时的内存泄漏

linux - 如何跟踪Linux中进程的CPU/内存使用情况?

swift - SKSpriteNode 沿向量移动

c++ - 如何通过 `friend` 将流运算符<<放在模板化类主体之外?