我有一个 c++ 接口,并且该接口的派生类在一个 DLL 中,我通过包含接口头文件并导入返回派生类对象(COM 样式)的工厂函数在另一个进程中使用该类:
MyInterface
{
public:
virtual ~MyInterface(){}
virtual A() = 0;
}
MyDerivedClass : MyInterface
{
public:
virtual ~MyDerivedClass (){...};
A(){...};
}
__declspec(dllexport) MyInterface* getObject()
{
return (new MyDerivedClass());
}
当我在我的 DLL(单元测试)中进行测试时,我会这样做:
std::tr1::shared_ptr<MyInterface> MyInterfaceObj; //global
func1() //initilize
{
std::tr1::shared_ptr<MyInterface> temp(getObject());
MyInterfaceObj.swap(temp);
}
func2()
{
//use MyInterfaceObj;
}
一切正常,我使用视觉检漏仪,没有任何抱怨,我可以看到调用了 MyDerivedClass 析构函数。
但是,当我在我的进程(加载 DLL)中执行完全相同的操作时,MyDerivedClass 析构函数永远不会被调用,并且 VLD 会抱怨内存泄漏。
但是,如果我在 func2() [在我的过程中] 声明所有内容,则一切正常,没有泄漏,并且调用了析构函数:
func2()
{
std::tr1::shared_ptr<MyInterface> MyInterfaceObj; // not global anymore
std::tr1::shared_ptr<MyInterface> temp(getObject());
MyInterfaceObj.swap(temp); //I know this is useless here, just wanted to have the same steps as before
//use MyInterfaceObj;
}
我需要在我的流程中拥有第一个结构(一个全局变量,由一个函数初始化,然后在心跳函数中使用)。
任何想法为什么会发生这种情况?!,我试图创建一个函数来释放内存(它有“删除这个”)并将它传递给智能指针构造函数,但它不会改变任何东西。
(使用视觉 c++ 2008 sp1)