我正在编写一个程序,最终需要我为自定义类的对象创建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”时,一切行为都相同。
我做错了什么,或者这是用智能指针向量预期的?
谢谢!
答案 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/
缩小以适应请求容器降低其容量以适应它 大小
请求是非绑定的,容器实现是免费的 否则优化并使载体具有更大的容量 比它的大小。
这可能会导致重新分配,但对矢量大小没有影响 并且不能改变它的元素。