【发布时间】:2010-12-11 06:00:27
【问题描述】:
我正在尝试创建一个简单的 Win32 DLL。作为 DLL 和 EXE 之间的接口,我使用 C 函数,但在 DLL 内部,我使用 C++ 单例对象。以下是我的 DLL 实现示例:
// MyDLLInterface.cpp 文件--------------------
#include "stdafx.h"
#include <memory>
#include "MyDLLInterface.h"
class MySingleton
{
friend class std::auto_ptr< MySingleton >;
static std::auto_ptr< MySingleton > m_pInstance;
MySingleton()
{
m_pName = new char[32];
strcpy(m_pName, “MySingleton”);
}
virtual ~ MySingleton()
{
delete [] m_pName;
}
MySingleton(const MySingleton&);
MySingleton& operator=(const MySingleton&);
public:
static MySingleton* Instance()
{
if (!m_pInstance.get())
m_pInstance.reset(new MySingleton);
return m_pInstance.get();
}
static void Delete()
{
m_pInstance.reset(0);
}
void Function() {}
private:
char* m_pName;
};
std::auto_ptr<MySingleton> MySingleton::m_pInstance(0);
void MyInterfaceFunction()
{
MySingleton::Instance()->Function();
}
void MyInterfaceUninitialize()
{
MySingleton::Delete();
}
// MyDLLInterface.h 文件 --------------------
#if defined(MY_DLL)
#define MY_DLL_EXPORT __declspec(dllexport)
#else
#define MY_DLL_EXPORT __declspec(dllimport)
#endif
MY_DLL_EXPORT void MyInterfaceFunction();
MY_DLL_EXPORT void MyInterfaceUninitialize();
我遇到的问题或问题如下:如果我 不 从我的 EXE 调用 MyInterfaceUninitialize() ExitInstance() ,我有内存泄漏(m_pName 指针)。为什么会这样?看起来 MySingleton 的破坏发生在 EXE 退出后。是否可以提前一点强制DLL或EXE销毁MySingleton,这样我就不需要调用MyInterfaceUninitialize()函数了?
编辑: 感谢您的所有帮助和解释。现在我明白这是一个设计问题。如果我想继续使用当前的解决方案,我需要在我的 EXE 中调用 MyInterfaceUninitialize() 函数。如果我不这样做,也可以,因为单例在离开 EXE 范围时会破坏自身(但我需要忍受令人不安的调试器消息)。避免这种行为的唯一方法是重新考虑整个实现。
我还可以在 Visual Studio 中的 Linker->Input 下将我的 DLL 设置为“延迟加载的 DLL”,以消除令人不安的调试器消息。
【问题讨论】:
-
可能还应该将您的复制构造函数设为私有:“private: MySingleton(const MySingleton&);”
-
@PaulH:是的,但这不是这里的问题。
-
为什么会出现这个问题。如果我们明白这将更容易回答您的问题。就我个人而言,我不希望在 main() 退出之前销毁我的 singeltons。
标签: c++ c visual-studio visual-c++ mfc