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

时间:2015-02-27 19:09:07

标签: c++ visual-studio c++11 vector unique-ptr

我正在编写一个程序,最终需要我为自定义类的对象创建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”的emplace_back注释到“testvector”时,我得到8字节的内存泄漏。
当我什么都没有注释时,我得到了12个字节的内存泄漏 当我用“shared_ptr”替换所有“unique_ptr”时,一切行为都相同。

我做错了什么,或者这是用智能指针向量预期的?

谢谢!

1 个答案:

答案 0 :(得分:1)

std::vector::clear()

的文档中所述

http://www.cplusplus.com/reference/vector/vector/clear/

  

从矢量中移除所有元素(被销毁),然后离开   容器大小为0。        无法保证重新分配,并且由于调用此函数,无法保证向量容量发生变化。一个   强制重新分配的典型替代方法是使用swap。

这意味着,元素会被删除,但std::vector使用的内部存储不会被删除。

如果您的编译器支持C ++ 11,那么您可以使用std::vector::shrink_to_fit()尝试,以便将capacity设置为size,之后清除等于0.

http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/

  

缩小以适应请求容器降低其容量以适应它   大小

     

请求是非绑定的,容器实现是免费的   否则优化并使载体具有更大的容量   比它的大小。

     

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