全局智能指针未正确清理

时间:2013-04-15 03:25:16

标签: c++ memory-leaks c++11 shared-ptr smart-pointers

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

我需要在我的进程中拥有第一个结构(一个全局变量,由一个函数初始化,然后在心跳功能中使用)。

任何想法为什么会发生这种情况?!,我试图创建一个释放内存的函数(它具有“删除它”)并将其传递给智能指针构造函数,但它不会改变任何内容。

(使用visual c ++ 2008 sp1)

1 个答案:

答案 0 :(得分:3)

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

当你在函数内部而不是全局变量时,它只存在于函数的范围内。它将在函数结束时销毁。