关于把class做成dll后,使用起来很怪的问题

south2000 2005-10-19 08:55:20
我使用VC6 sp6。

我有一个类CMy,里面有new出内存的操作,在析构函数里面把new出来的内存释放掉,我这个析构函数做成虚函数,为了以后可以让其他类继承CMy。我这个类使用过好几年了,都很好用。

我在程序里面使用这个类,CMy *p = new CMy;在结束之前delete p;一切正常。如果这样用CMy m;也一切正常。

现在我说一下很怪的问题。
我把类CMy做成一个dll。
1。如果这样用CMy m;一切正常。

2。CMy *p = new CMy;在结束之前delete p;这样使用就回出错,在delete p处设置断点,只要一执行delete操作,系统就提示出错。"Debug Assertion Failed.Expression:_CrtIsValidHeapPointer(pUserData)."

3。我如果把CMy的析构函数不写成虚函数,那么
用CMy m;一切正常。
CMy *p = new CMy;在结束之前delete p;也一切正常。

请问怎么回事?
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxpws 2005-10-19
  • 打赏
  • 举报
回复
楼主的分配释放策略好像没问题吧
lxpws 2005-10-19
  • 打赏
  • 举报
回复
我用的vc7.0试了试,正常。楼主是什么版本的编译器?
shuihan84 2005-10-19
  • 打赏
  • 举报
回复
UP 一楼的
学习了:)
bo9527 2005-10-19
  • 打赏
  • 举报
回复
检查一下在dll中类的声明前面加上 __declspec(dllexport) 的声明了吗?
shuihan84 2005-10-19
  • 打赏
  • 举报
回复
经试验完全没问题
建议楼主贴出代码
  • 打赏
  • 举报
回复
你编译的时候用的哪些编译选项, 如果是 /ML(d) 或者是 /MT(d) , 你的 DLL 和 EXE 不是用的同一个堆, 如果你的对象在 DLL 中创建在 EXE 中销毁,或者在 EXE 中创建在 DLL 中销毁, 当然都会出问题地, 本来在一个模块里创建对象却在另一个模块销毁就不是一个好的设计, 你可以在 DLL 里导出个这样的函数 void DeleteCMy( CMy* p ) { delete p ; } 帮你干这件事情.
把编译选项改成 /MD(d) , DLL 和 EXE 就会使用同一个堆, 也就木有这种问题.

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧