gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:08:45 27 4
gpt4 key购买 nike

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

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

其中 rrrr 是引用计数,llll 是长度,0123 是元素,^ 是指针指向的位置。这证明了;我已经测试过了,它有效。
对于多维动态数组,我假设可以用array of Y替换array of X中的X,换句话说,外部维度只是一个动态数组(指向)动态数组,如下所示:

rrrrllll000011112222...        ^

其中元素 0000、1111 等现在是指向独立分配的动态数组的 32 位指针。然而,这样做会给我带来访问冲突,因为我的麻烦。这显然不是德尔福希望我这样做的方式。谁能向我解释一下我应该如何做到这一点?

最佳答案

动态数组是指向元素压缩 block 的指针。

所以 TSomeRecord 的数组的数组是一个指向指针数组的指针,每个指针都指向一个具有 length(array[firSTLevel]) 元素的 block 内存,如果没有则为 nil。

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

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com