std :: shared_ptr(s)和内存泄漏[关闭]

问题描述 投票:0回答:1

我的问题是当我创建2个共享指针时,它总是说运行后我有内存泄漏。

解析器或指针在执行结束时的某个时刻被调用,这意味着它们正在被销毁。

但是输出窗口仍然显示内存泄漏。

这是正常的吗?

注意:我也可以只用一个单身来解决这个问题

(头文件)

class SRNTY_API Log
{
public:
    inline static std::shared_ptr<sty::Logger>& GetEngineLogger() { return mEngineLogger; }
    inline static std::shared_ptr<sty::Logger>& GetClientLogger() { return mClientLogger; }

private:
    static std::shared_ptr<sty::Logger> mEngineLogger;
    static std::shared_ptr<sty::Logger> mClientLogger;
};

(源文件)

std::shared_ptr<sty::Logger> Log::mEngineLogger = std::make_shared<sty::Logger>();
std::shared_ptr<sty::Logger> Log::mClientLogger = std::make_shared<sty::Logger>();
UPDATE BELOW

我被问到他对这个问题的评论我是如何检查内存泄漏的。我可以确认我没有使用_CRTDBG_CHECK_ALWAYS_DF标志,我正在调用_CrtDumpMemoryLeaks()输出泄漏量,并且断言值应为0.我将展示代码示例。

int main(int argc, char* argv[])
 {
    // detect memory leaks
#if defined(DEBUG) | defined(_DEBUG)
    HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtSetBreakAlloc(0);
    //int mlCount = _CrtDumpMemoryLeaks();
    //wprintf(L"Number of memory Leaks: %d\r\n\r\n", mlCount);
    //assert(mlCount == 0);
#endif

    // run main loop

    _CrtDumpMemoryLeaks(); // attempted calling it here and still got memory leaks as it must release the shared pointers after it returns
    return 0;
}

所以我已经知道它在完全返回操作系统后释放了std::shared_ptr<T>。但是它在运行后仍然显示出错误的内存泄漏。

我尝试过的其他事情是:

Singleton,我做了一个Singleton界面我没有问题,没有内存泄漏。但是我并不反对Singleton,但我更喜欢使用c ++ std lib的共享指针,毫无疑问它们比我的Singleton解决方案更好,而且编译器也将针对std lib进行优化而不是我的代码。

我已经搜索了一个调用CrtDumpMemoryLeaks()的位置,但我编写代码的方式我不能在Log析构函数中调用它,甚至不确定它会产生正确的结果而不显示内存泄漏。

(inoncopyable.h)

class INonCopyable
{
protected:
    INonCopyable(void) {}
    virtual ~INonCopyable(void) {}
private:
    INonCopyable(const INonCopyable& other) = delete;
    const INonCopyable& operator= (const INonCopyable& other) = delete;
};

(isingleton.h)

template<typename T>
class ISingleton : public INonCopyable
{
public:
    inline static T& GetInstance() { if (!mInstance) { mInstance = new T(); } return *mInstance; }
    inline static void DestroyInstance() { delete mInstance; mInstance = nullptr; }

private:
    inline static T* mInstance = nullptr;
};

使用Singleton时Log类实现的方式更改为

class SRNTY_API EngineLog : public ISingleton<EngineLog>, public sty::Logger
{
};

class SRNTY_API ClientLog : public ISingleton<ClientLog>, public sty::Logger
{
};

综述:

使用Singleton时没有内存泄漏,我可以使用它吗?它在c ++ 17中是否安全?如果可能的话,std::share_ptr<T>何时何地应该调用CrtDumpMemoryLeaks()函数?或者我应该如何实现std::share_ptr<T>以避免错误的内存泄漏?

希望这会碰到问题:)

c++ pointers memory
1个回答
0
投票

我想自己回答这个问题。

首先感谢那些评论和提供信息的人。

当使用std::shared_ptr<T>时,问题是手动调用_CrtDumpMemoryLeaks()你需要做的是使用标志_CRTDBG_CHECK_ALWAYS_DF,它会在运行结束时自动检查内存泄漏。

我最终使用的代码是:

    // detect memory leaks
#if defined(DEBUG) | defined(_DEBUG)
    HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) | _CRTDBG_CHECK_ALWAYS_DF); // added in _CRTDBG_CHECK_ALWAYS_DF
    _CrtSetBreakAlloc(0);
#endif

希望这有助于将来:)

© www.soinside.com 2019 - 2024. All rights reserved.