我写了一个dll,其中有一个函数返回一个数组,
然后我在一个窗体应用程序中调用,但是每次每次循环调用完毕都有一个指针错误。
后来,我把接受数组的变量改成模块级别的变量,运行的时候没有问题了,
但窗体退出的时候,问题照样存在。这明显是释放了不该释放的指针或释放的时候指针已经是nil的。请大家讨论delphi中内存管理,与指针的使用。

解决方案 »

  1.   

    如果你没有uses sharemem那么exe和dll都有自己单独的内存管理模块。 互访由于处于同一个进程空间并且不违反windows的virtual memory访问规则所以不出错, 但是由其中一个释放另一个申请的内存则必然出现问题, 因为这个内存管理器中并没有记录另一个内存管理器分配的内存块。
    所以由dll分配内存然后交给exe来释放绝对是一个愚蠢的做法。
      

  2.   

    ***所以由dll分配内存然后交给exe来释放绝对是一个愚蠢的做法。
    同意!
    其实在dll中返回数组,不仅仅在delphi中有楼主说的问题,在C/C++中问题同样存在
    我的一般作法是,返回静态(或全程)数组.这样,不用动态分配内存,唯一的缺点是只能返回固定长度的数组
    当然,正规的作法(多看国外高手源码)
      在exe中申请/释放内存,将数组作为指针参数调用dll,在dll中改数组的值
      

  3.   

    在exe中申请/释放内存,将数组作为指针参数调用dll,在dll中改数组的值
    同意:)
    参考windows api的做法吧:
    procedure f(var buf; const bufsize: Integer);
      

  4.   

    动态数组或string由系统管理内存,并不是简单的一个指针,还包括引用技术等,所以在不同模块中传输会有释放内存不匹配的问题,不要用他们做var类型参数或返回值
      

  5.   

    不要用dll中的函数返回数组,这会带来许多内存管理的问题.
    建议在dll中使用内存映象文件传递数组.