try / finally导致异常

时间:2014-09-27 04:01:58

标签: delphi

一个方法被调用到一个外部C / C ++库,它返回一个指向Delphi XE6应用程序的指针。然后是try / finally块,最后释放由C / C ++库分配的内存。如果我在finally中释放内存,我将获得免费的特权指令异常。如果我释放try / finally块之外的内存,则没有异常。

// This crashes
ptr := CMethod();

try
  // 
finally
  freeCPtr (ptr);
end

// This doesn't crash
ptr := CMethod();
freeCPtr (ptr)

请注意,freeCPtr()是由C库导出的方法,旨在释放CMethod()返回的指针。已经证明CMethod()和freeCPtr()在两个独立的第三方开发人员的C应用程序中没有问题。我很想知道为什么使用try / finally可能会导致异常?

UPDATE 事实证明,原始C / C ++库的作者已将其调用约定从stdcall更改为cdecl。通常我会在遇到问题时先检查调用约定,但我知道以前的代码我工作正常,因此最初没有考虑检查调用约定。故事的道德是,每当调用外部库时出现奇怪的行为,检查:1)调用约定是兼容的; 2)您正在将正确的类型传递给外部库。

1 个答案:

答案 0 :(得分:0)

很难看出问题是什么,但根据我的经验,这些无法解释的问题在一个版本而不是另一个版本中有效,特别是当调用外部C / C ++ .dll:s时,当优化设置为开启时出现。

确保在您正在使用的项目设置或配置文件中未将优化设置为on,并查看是否有所不同。当然,在单位中使用{$ Optimization Off}也可以。

我意识到这可能更多的是评论而非答案,但我是一个新手,我没有那么多要点。 : - )