unique_ptr的矢量未被完全删除(内存泄漏)

vector of unique_ptr not being fully deleted (memory leaks)

本文关键字:删除 内存 泄漏 ptr unique      更新时间:2023-10-16

我正在编写一个程序,该程序最终需要创建一个指向自定义类对象的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/

收缩以适应请求容器减少容量以适应大小

请求是不绑定的,容器实现是免费的以其他方式进行优化,并使向量的容量更大比它的尺寸大。

这可能会导致重新分配,但对矢量大小没有影响并且不能改变其元素。