VC2005下写的dll,用VC6.0调用

xiantongyuan 2008-02-02 04:33:11
有一个dll是用vc2005写的,在dll里有用new出来的空间。
然后在vc6.0下写的ap,去释放这块内存,结果crash了,
这是为什么啊?
难道他们的实现有区别吗?
望各位大虾给与指点。
...全文
405 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
homejiji 2008-02-05
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
我是想知道同样都是C++标准为什么会造成这样的结果呢?

标准只规定结果了,没有规定实现,所以就算是VC6和VC7都不一样.
hertcloud 2008-02-04
  • 打赏
  • 举报
回复
学习
Fogers 2008-02-04
  • 打赏
  • 举报
回复
学习了
xiantongyuan 2008-02-03
  • 打赏
  • 举报
回复
谢谢楼上的, 我已经选了MTD选项了, 我是想知道同样都是C++标准为什么会造成这样的结果呢?
hong8292 2008-02-03
  • 打赏
  • 举报
回复
补充:不好意思。应该是/MD(多线程DLL)或/MDd(多线程DLL调试)


回Lz的问题:这个不是C++的标准。关于动态链接每个操作系统上实现的方法不一样,所以这个不是标准。你用的是Winodws系统上的DLL,所以我是针对这个特定平台上的DLL进行回答的。
hong8292 2008-02-02
  • 打赏
  • 举报
回复
Lz ,我知道为什么,你把分给我吧,HOHO...

首先,单个地址空间是由一个可执行模块和若干个D L L模块组成的。这些模块中,有些可以链接到静态版本的C / C + +运行期库,有些可以链接到一个D L L版本的C / C + +运行期库,而有些模块(如果不是用C / C + +编写的话)则根本不需要C / C + +运行期库。许多开发人员经常会犯一个常见的错误,因为他们忘记了若干个C / C + +运行期库可以存在于单个地址空间中。

你正在用E X E的函数去释放由D L L函数分配的内存块。然而释放可能成功也可能失败:
1.如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。
2.如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那么对delete函数的调用就会失败

解决方法是在DLL里增加一个函数,封装delete的操作,要释放内存,就调用找个函数;或者,你的EXE和DLL链接全部选择MTD版本(多线程动态链接,在你的编译器选项里面有)。
agaric 2008-02-02
  • 打赏
  • 举报
回复
###你这样做,肯定就是有问题的。
michney 2008-02-02
  • 打赏
  • 举报
回复
谁分配,谁释放
dll分配的,就要设计一个释放接口,给别人调用
  • 打赏
  • 举报
回复
你只能选择内存泄露了.
wshcdr 2008-02-02
  • 打赏
  • 举报
回复
要注意两个工程 使用 的 同一个 倒出函数定义文件

否则会出问题
xiantongyuan 2008-02-02
  • 打赏
  • 举报
回复
我一开始就怀疑是heap不一致造成的原因,但是在xp下不是每次都发生,但在vista下就经常发生了
xiantongyuan 2008-02-02
  • 打赏
  • 举报
回复
to Kimm2009
我用的是非托管的
taodm 2008-02-02
  • 打赏
  • 举报
回复
如果那个dll你真的实在无法修改,选择内存泄漏吧。
正常编程手段,无法保证你可以安全归还内存。
Kimm2009 2008-02-02
  • 打赏
  • 举报
回复
你的dll是用什么创建的,是2005里面的MCPP(MANAGED C++)还是NCPP(NATIVE C++),是NCPP的话应该没问题的。1楼说的是让你尽量用NCPP创建,应为其机制就是VC的编译机制,MCPP是托管机制,可能会有点差别。
xiantongyuan 2008-02-02
  • 打赏
  • 举报
回复
to:taodm
要是我写的话,也会那样,关键是别人的dll,
我只是拿来用,你这样不是难为我吗?
xiantongyuan 2008-02-02
  • 打赏
  • 举报
回复
如下所示代码,
我在dll里,很简单就写一个函数如下
void New(char **pChar)
{
*pChar = new char[10];
}

然后再ap中调用它,
如:
int main()
{
char *pChar = NULL;
New(&pChar);

delete[] pChar;

return 0;
}

结果在我delete时,ap crash掉了。
kou_ryou 2008-02-02
  • 打赏
  • 举报
回复
难道是传说中的移植
taodm 2008-02-02
  • 打赏
  • 举报
回复
让dll导出一个destory函数来释放内存。
xiantongyuan 2008-02-02
  • 打赏
  • 举报
回复
2楼的,如何查看托管状态,以及如何禁用它呢,刚用2005,
加载更多回复(5)

64,637

社区成员

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

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