尽管使用静态unique_ptr调用析构函数,但内存泄漏

Memory leak despite destructor call using static unique_ptr

本文关键字:析构函数 调用 泄漏 内存 ptr 静态 unique      更新时间:2023-10-16

我使用 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被销毁,这将调用测试析构函数。

但是_CrtDumpMemoryLeaks向我展示了S::te.get()内存位置的内存泄漏,该位置是指向(已破坏的(测试对象的指针。

我不理解这种行为。

我不能使用静态unique_ptr吗?尽管析构函数是由unique_ptr实现调用的,但为什么会出现泄漏?

如果您尝试在静态销毁发生之前检查泄漏,则会发生这种情况。

要解决此问题,您可以在应用程序开始时调用带有_CRTDBG_LEAK_CHECK_DF的_CrtSetDbgFlag;它将在静态销毁后在退出时自动调用_CrtDumpMemoryLeaks