X的动态数组的Delphi动态数组的内存布局是什么?

时间:2009-10-05 09:23:41

标签: delphi arrays memory-layout

我试图用C#调用Delphi DLL中的一个过程。该过程期望调用者预先分配并输入array of array of TSomeRecord,然后它将操纵TSomeRecord元素作为返回结果的方法。所以,我需要手工制作Delphi数组的Delphi动态数组 现在,I have found here动态array of X由指向动态数组的第一个元素的指针组成,并且第一个元素具有引用计数和数组的长度(元素数)前置(两个32位整数),并且元素是内联和连续存储的,所以整个事情在内存中看起来像这样:

rrrrllll000...000111...12...
        ^

rrrr是引用计数,llll是长度,0123是元素,^是指针指向的位置。这证明了;我测试了它,它的工作原理 对于多维动态数组,我假设我可以用array of Y代替X中的array of X,换句话说,外部维度只是动态数组的动态数组(指向),像这样:

rrrrllll000011112222...
        ^

其中元素0000,1111等现在是独立分配的动态数组的32位指针。但是,这样做会让我遇到麻烦的访问权限。这显然不是德尔福希望我这样做的方式。任何人都可以向我解释我应该怎么做?

2 个答案:

答案 0 :(得分:8)

动态数组是指向打包的元素块的指针。

因此TSomeRecord数组的数组是指向指针数组的指针,每个指针指向具有length(array [firstlevel])元素的块内存,如果没有则指向nil。

换句话说,你所假设的大致是正确的,并且添加了零元素的数组为零。请注意,除非您真的知道自己在做什么,否则不应自行更改引用次数和长度。

如果没有示例代码,确定导致崩溃的原因将很困难。请记住,对于 ALL 自动Delphi类型(widestring除外),所有动态内存必须由delphi内存管理器分配。

尝试使用您正在连接的任何语言的内存管理器是不可能的。

答案 1 :(得分:0)

语言指南(一旦作为非常有用的印刷手册提供,现在在在线帮助中找到此信息非常困难)声明:

“存储多维数组,最右边的维度首先增加。”

因此,AFAIK你没有一个指针数组 - 从最右边开始,每个维度数据都是一个接一个,我想它更快,因为没有更多的间接。