我的问题是,当我创建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>();
以下更新
有人问我我对这个问题的评论,我是如何检查内存泄漏的。我可以确认我没有使用_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>
来避免错误的内存泄漏?
希望这可以解决这个问题:)
答案 0 :(得分: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
希望这对以后的工作有帮助:)