【发布时间】:2015-04-30 14:29:33
【问题描述】:
我正在编写一个程序,最终需要我为自定义类的对象创建一个 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”时,一切都表现相同。
我做错了什么,还是智能指针向量会出现这种情况?
谢谢!
【问题讨论】:
-
尝试将所有代码放在大括号中,以便在检查内存泄漏之前运行向量的析构函数。
clear()将销毁对象,但向量可能会保留内存(您可以使用capacity()检查)以供将来使用。 -
@Cornstalks 我应该把哪个代码放在大括号里?
-
_CrtDumpMemoryLeaks();之前的所有内容。这样,您可以确保testvector在检查内存泄漏之前 被完全销毁。 -
漂亮,谢谢!像魅力一样工作。
标签: c++ visual-studio c++11 vector unique-ptr