我正在尝试从C#调用Delphi DLL中的过程。该过程希望调用者预先分配并输入一个array of array of TSomeRecord,然后它将操作TSomeRecord元素作为返回结果的一种方式。因此,我需要手工制作X数组的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位指针。但是,以这种方式进行操作会使我因遇到麻烦而导致访问冲突。显然这不是Delphi期望我这样做的方式。谁能向我解释我应该怎么做?

最佳答案

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

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

换句话说,您的假设大致正确,此外,零元素的数组为nil。请注意,除非您真的知道自己在做什么,否则您不应该自己更改引用计数和长度。

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

尝试使用与您连接的任何语言的内存管理器进行尝试。

关于delphi - X动态数组的Delphi动态数组的内存布局是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1519016/

10-17 03:11