[解决办法] Caller中第1种情况 procedure xxx; var arr: tarr of Tmyrec; begin DLLFun(arr); //DLL申请数组的内存,xxx只提供一个指针地址给,DLLFun中填一个地址到arr上 end;//这里会释放本过程中的自动管理内存的变量,如String,Array,Variant等 释放一个在DLL中申请的内存,在都没有引用ShareMem.pas的情况下,要异常/溢出.
Caller中第2种情况 var arr: tarr of Tmyrec;//全局变量 procedure xxx; begin DLLFun(arr); //DLL申请数组的内存,xxx只提供一个指针地址,DLLFun中填一个地址到arr上 end;//这里不会执行任何关于arr的操作 这种情况下,arr变量的内存会一直存在,直到进程结束.如果始终保证同一个DLL执行SetLength,而且只在这个DLL中SetLength(多次执行/不同的函数中执行都一样)就不会导致内存泄露,而且arr也能正常使用 但是:如果中途释放了DLL(FreeLibrary),那这个arr指针指向的内存将变得不确定(随着DLL释放而释放),如果Exe和DLL或者其他DLL都有对这个array的SetLength,是不正确的,异常. 如果都引用了ShareMem.pas除外.
正确的作法: Exe中申请内存,DLL填值,并返回填了多少个值 procedure xxx; var arr: tarr of Tmyrec; Count : integer; begin SetLength(arr, MaxCount); Count := DLLFun(arr);//由于array同时具有长度,所以这里不需要传MaxCount进去了 for i:=0 to Count-1 do ... end;