关于的delphi中的指针问题(感兴趣者进,为了分数者免)

louisqiang 2005-12-11 04:18:29
我写了一个dll,其中有一个函数返回一个数组,
然后我在一个窗体应用程序中调用,但是每次每次循环调用完毕都有一个指针错误。
后来,我把接受数组的变量改成模块级别的变量,运行的时候没有问题了,
但窗体退出的时候,问题照样存在。

这明显是释放了不该释放的指针或释放的时候指针已经是nil的。

请大家讨论delphi中内存管理,与指针的使用。
...全文
168 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
followwater 2005-12-12
  • 打赏
  • 举报
回复
动态数组或string由系统管理内存,并不是简单的一个指针,还包括引用技术等,所以在不同模块中传输会有释放内存不匹配的问题,不要用他们做var类型参数或返回值
仙侣步惊云 2005-12-12
  • 打赏
  • 举报
回复
不要用dll中的函数返回数组,这会带来许多内存管理的问题.
建议在dll中使用内存映象文件传递数组.
qizhanfeng 2005-12-12
  • 打赏
  • 举报
回复
学习
aiirii 2005-12-11
  • 打赏
  • 举报
回复
你代码处理的问题,
clasj 2005-12-11
  • 打赏
  • 举报
回复
在exe中申请/释放内存,将数组作为指针参数调用dll,在dll中改数组的值
同意:)
参考windows api的做法吧:
procedure f(var buf; const bufsize: Integer);
柯本 2005-12-11
  • 打赏
  • 举报
回复
***所以由dll分配内存然后交给exe来释放绝对是一个愚蠢的做法。
同意!
其实在dll中返回数组,不仅仅在delphi中有楼主说的问题,在C/C++中问题同样存在
我的一般作法是,返回静态(或全程)数组.这样,不用动态分配内存,唯一的缺点是只能返回固定长度的数组
当然,正规的作法(多看国外高手源码)
在exe中申请/释放内存,将数组作为指针参数调用dll,在dll中改数组的值
阿呆_ 2005-12-11
  • 打赏
  • 举报
回复
如果你没有uses sharemem那么exe和dll都有自己单独的内存管理模块。 互访由于处于同一个进程空间并且不违反windows的virtual memory访问规则所以不出错, 但是由其中一个释放另一个申请的内存则必然出现问题, 因为这个内存管理器中并没有记录另一个内存管理器分配的内存块。
所以由dll分配内存然后交给exe来释放绝对是一个愚蠢的做法。

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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