gpt4 book ai didi

c++ - 全局智能指针未正确清理

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:50 24 4
gpt4 key购买 nike

我有一个 C++ 接口(interface),以及一个 DLL 中该接口(interface)的派生类,我通过包含接口(interface)头文件在另一个进程中使用该类,并导入一个返回派生类对象的工厂函数(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)

最佳答案

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

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

关于c++ - 全局智能指针未正确清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com