【发布时间】:2014-06-15 06:03:04
【问题描述】:
我的程序有以下代码:
function FooBar(const s: string): string;
var
sa: AnsiString;
begin
// ..........................
sa := AnsiString(s);
sa := AnsiString(StringReplace(string(sa), '*', '=', [rfReplaceAll]));
sa := AnsiString(StringReplace(string(sa), ' ', '+', [rfReplaceAll]));
result := string(sa);
// ..........................
end;
我注意到程序确实在“某处”崩溃了,FastMM4 说我写入了一个已释放的对象。一旦我注释掉“const”,程序就可以工作了。
我已阅读有关 const 参数的 Delphi 文档,但我无法弄清楚为什么 const 参数会使程序崩溃。我很想了解它。
更新:程序只会在 Delphi 6 中崩溃,并且只有在优化开启时才会崩溃。如果优化关闭,程序将正常工作。可能是 Delphi 的错误?
【问题讨论】:
-
你可以试试没有 sa 像这样:
Result:=AnsiString(s);Result:=AnsiString(StringReplace(string(Result),...? -
为什么在Delphi6中使用这些转换,默认情况下string = AnsiString?
-
因为我正在编写一个必须由 Delphi 6 和 XE4 使用的组件。我不想在我的代码中出现任何警告,所以我明确地转换了它们(而且这个函数只做 Base64 的东西,所以转换是可以的,不会影响 Unicode 能力)。
-
只使用字符串。这里不需要转换。 StringReplace 将起作用。
-
如果您从该函数中删除所有类型转换和所有提及
AnsiString,那么您将不会收到任何隐式转换警告,因为不会有任何隐式转换。跨度>
标签: string delphi memory crash constants