C++ Space

C++, 3DGame

关于DLL中对象的动态创建与删除的问题

最近有看到一些文章讨论怎样轻松的使用DLL,其中有一个错误,那就是在DLL中创建的对象未在DLL中删除,如下示:

//someheadfile.h
#include<memory>

class __declspec(dllexport) Interface
{
 
public:
  virtual 
void foo() = 0;
}
;

class __declspec(dllexport) Impl : public Interface
{
 
public:
   virtual 
void foo()
   
{}
}
;

__declspec(dllexport)
std::auto_ptr
<Impl> DLLCreate()
{
  
return std::auto_ptr<Impl>(new Impl);
}

上面的做法貌似可以做到自动删除动态生成的对象,但,只有DLL和用户都动态链接C/C++运行库时它才会运行正确,否则,创建和删除会在不同的堆栈空间进行,从而导致错误 
所以还是老实的在提供一个
DLLDelete()用于删除在DLL中生成的对象。

posted on 2007-04-20 13:35 Kooyu 阅读(1529) 评论(6)  编辑 收藏 引用

Feedback

# re: 关于DLL中对象的动态创建与删除的问题[未登录] 2007-04-20 16:00 梦在天涯

恩,没有试过,但是怎么才是使DLL和用户都动态链接C/C++运行库那,哈哈!来电详细的解释o!

谢谢!

欢迎加入:msn 的C++群: group2041@xiaoi.com  回复  更多评论   

# re: 关于DLL中对象的动态创建与删除的问题 2007-04-20 16:40 Kooyu

就是正在创建的DLL和使用这个DLL的用户都静态而不是动态链接c/c++运行库  回复  更多评论   

# re: 关于DLL中对象的动态创建与删除的问题 2007-04-20 20:35 eXile

老兄,我用的不是auto_ptr,而是shared_ptr, 我的做法并没有错。另外,在复杂的系统中,手工管理内存总是有点危险,而shared_ptr已被列为tr1标准,我们不要停留在原始社会,还是用点新技术吧!  回复  更多评论   

# re: 关于DLL中对象的动态创建与删除的问题 2007-04-23 13:03 Kooyu

@eXile
我虚心接受你的批评。  回复  更多评论   

# re: 关于DLL中对象的动态创建与删除的问题 2007-04-23 14:38 eXile

呵呵,DLL中使用shared_ptr的说明:http://www.cppblog.com/eXile/archive/2007/04/23/22637.html  回复  更多评论   

# re: 关于DLL中对象的动态创建与删除的问题[未登录] 2008-06-17 17:43 南郁

同意作者的观点。
提供一个DllFree();
然后自己写一个 dll_auto_ptr:

struct dll_auto_ptr
{
...
~dll_auto_ptr<>
{
DllFree(p);
}
...
private:

};  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理