gpt4 book ai didi

delphi - 什么会导致 System.Move 偶尔给出错误结果?

转载 作者:行者123 更新时间:2023-12-03 15:21:44 25 4
gpt4 key购买 nike

过去几天,我们的第三方开发的数据库组件遇到了一些奇怪的问题。这些组件几个月来没有发生任何变化。过去几天更改的代码是我们自己的代码,我们还更新了另一个第三方开发的 gui 组件。

经过调试,我发现在其中一个数据库组件程序中调用 System.Move 有时会给出错误的结果!

请从数据库组件中查看下面的代码并阅读我的评论。这种不一致的行为怎么会发生呢?谁能告诉我如何继续找到这种不一致行为的原因?注意!我不认为这段代码有什么问题,它只是为了解释问题的“症状”。我的猜测是,我们的代码或更新的 gui 组件代码导致了某种内存损坏或其他原因。

编辑:查看下面链接的博文。看来这可能与我的问题有关。至少在我读到它时,它证实了 System.Move 可能会给出错误的结果: http://blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/

编辑:很抱歉没有早点发布我的“解决方案”,但它来了:当使用 Delphi 2007 时,我的问题通过使用 FastMove 来解决,它取代了 System.Move。升级到 Delphi 2010 后我还没有遇到这个问题,我们不再使用 FastMove。

Procedure InternalDescribe;
var
cbufl: sb4; //sb4=LongInt
cbuf: array[0..30] of char;
cbufp: PChar;
//....
begin
//..Some code
repeat
//...Some code to initialize cbufp and cbufl

//On the 15. iteration the values immediately Before Move are always these:
//cbufp = 'STDPRODUCTSTOREDELEMENTSCOUNT'
//cbuf = ('S', 'T', 'A', 'T', 'U', 'S', #0, 'E', 'V', 'A', 'R', 'R', 'E', 'C', 'I', 'D', #0, 'D', 'U', 'C', 'T', 'I', 'D', #0, #0, #0, #0, #0, #0, #0, #0)
//cbufl = 29

Move(cbufp^, cbuf, cbufl);

//Values immediately After Move should then be:
//cbuf = ('S', 'T', 'D', 'P', 'R', 'O', 'D', 'U', 'C', 'T', 'S', 'T', 'O', 'R', 'E', 'D', 'E', 'L', 'E', 'M', 'E', 'N', 'T', 'S', 'C', 'O', 'U', 'N', 'T', #0, #0)

//But sometimes this Move results in this value( 1 in 5..15 times):
//cbuf = ('S', 'T', 'D', 'P', 'R', 'O', 'D', 'U', 'C', 'T', 'S', 'T', 'O', 'R', 'E', 'D', #0, #0, #0, #0, #0, 'N', 'T', 'S', 'C', 'O', 'U', 'N', 'T', #0, #0) }

until SomeCondition;
//...Some more code
end;

最佳答案

Move 不会给出错误的结果,或者至少我从未见过任何这样的情况。更有可能的是,你的缓冲区中有一些意想不到的东西。尝试在此例程中添加对 Windows.OutputDebugString 的调用,以查看之前和之后复制的内容。

关于delphi - 什么会导致 System.Move 偶尔给出错误结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466229/

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