unique_ptr的矢量未被完全删除(内存泄漏)
vector of unique_ptr not being fully deleted (memory leaks)
我正在编写一个程序,该程序最终需要创建一个指向自定义类对象的unique_ptrs向量。我遇到了一些内存泄漏,所以我决定从等式中删除自定义类,并使用unique_ptr进行尝试。
当我尝试在堆栈上创建unique_ptr时,没有泄漏。但是,创建unique_ptrs的向量会发生泄漏。为了好玩,我还尝试将unique_ptr移动到向量中,看看发生了什么。我的代码如下(包括MSVS内存检查):
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <vector>
#include <memory>
using namespace std;
int main()
{
vector<unique_ptr<int>> testvector;
unique_ptr<int> addMe;
testvector.emplace_back(move(addMe));
testvector.clear();
_CrtDumpMemoryLeaks();
return 0;
}
当我评论掉除了创建"addMe"之外的所有内容时,我没有得到任何泄漏
当我注释掉除了创建"testvector"之外的所有内容时,我得到了8个字节的内存泄漏
当我将"addme"的template_back注释为"testvector"时,我得到了8个字节的内存泄漏
当我什么都不评论时,我得到了12个字节的内存泄漏
当我用"shared_ptr"替换所有的"unique_ptr"时,所有的行为都是一样的。
我是做错了什么,还是智能指针的矢量会出现这种情况?
谢谢!
如std::vector::clear()
文档中所述
http://www.cplusplus.com/reference/vector/vector/clear/
从矢量中删除所有元素(已销毁),留下大小为0的容器。不保证会发生重新分配,也不保证向量容量会因调用此函数而发生变化。A.强制重新分配的典型替代方案是使用掉期。
这意味着元素会被删除,但std::vector
使用的内部存储不会。
如果编译器支持C++11,则可以使用std::vector::shrink_to_fit()
来尝试,使capacity
设置为size
,清除后等于0。
http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/
收缩以适应请求容器减少容量以适应大小
请求是不绑定的,容器实现是免费的以其他方式进行优化,并使向量的容量更大比它的尺寸大。
这可能会导致重新分配,但对矢量大小没有影响并且不能改变其元素。
- 在c++中删除内存失败
- delete[]有问题,如何部分删除内存
- 在这种情况下,我必须删除内存吗?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 我可以在使用 winsoc 发送缓冲区后删除内存吗?
- 最好的方法是删除内存泄漏
- com,删除内存,而不是调用版本()
- 如何调用返回后删除[]内存
- 删除内存空间后,指针的值保持不变还是更改?对象内容是否将被更改
- unique_ptr的矢量未被完全删除(内存泄漏)
- 在析构函数中安全地删除内存
- (C++) list.error 方法和使用指针删除内存
- 为结构C++中的指针分配和删除内存
- 正在读取指向已删除内存未定义行为的指针
- 何时会在单一实例中删除内存
- 删除内存时遇到困难
- 在 go 中删除内存
- 在C++中使用智能指针分配和删除内存的有效方法
- Cpp删除内存
- 手动调用析构函数后如何删除内存