【发布时间】:2013-12-06 14:12:03
【问题描述】:
我使用unique_ptr 作为静态数据成员来保存指针。
struct Test
{
int i;
~Test()
{
cout << "destructed" << endl;
}
};
struct S
{
static unique_ptr<Test> te;
};
unique_ptr<Test> S::te = unique_ptr<Test>(new Test());
在程序终止时,S::te 被破坏,调用 Test-destructor。
但是 _CrtDumpMemoryLeaks 向我显示了 S::te.get() 的内存位置上的内存泄漏,这是指向(被破坏的)测试对象的指针。
我不明白这种行为。
我不能使用静态unique_ptr 吗? unique_ptr 实现虽然调用了析构函数,但为什么会有泄漏?
【问题讨论】:
-
你是直接调用
_CrtDumpMemoryLeaks吗? -
你的逻辑有问题。当一个工具报告您的代码中存在内存泄漏时,这并不一定意味着您的代码中存在内存泄漏。这也可能是泄漏检测工具中的缺陷或错误——或该工具的错误使用。在这种情况下,您的
unique_ptr将不会泄漏内存。 -
你能发布一个完整的工作示例
-
@jalf 那么,你能推荐另一个在 windows 下的 Visual Studio 2013 泄漏检测工具,它不是那么错误吗?
-
不,我没有说该工具一定有故障。 (不是。但是您分配的内存在静态对象被销毁之前不会被释放。如果该工具在此之前检查泄漏,那么它将看到尚未释放的已分配内存块
标签: c++ memory-leaks static unique-ptr