2

我有一个 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)

4

1 回答 1

3

无法保证全局变量的破坏顺序。在 DLL 中的测试代码的情况下,它显然在泄漏检测发生之前破坏了全局,但是当你在应用程序中拥有它时它不会。它仍然会在应用程序退出之前被销毁。

当您在函数内部而不是全局变量中具有变量时,它将仅存在于函数范围内。它将在函数结束时被销毁。

于 2013-04-15T03:57:51.463 回答