Show/Hide Toolbars

XSharp

 

编译器会自动生成 PSZ 转换。这会导致应用程序内存泄漏。请使用 String2Psz() 让编译器管理 PSZ 的生存期限,或者使用 StringAlloc() 并自行记忆 PSZ 的生存期限。

 

这种情况可能发生在以下代码中:

FUNCTION Start() AS VOID
LOCAL uValue AS USUAL
uValue := "SomeString"
? Test(uValue)
? Test(PSZ(_CAST, "AnotherString"))
RETURN
 
FUNCTION Test(p AS PSZ) AS STRING
RETURN Psz2String(p)

编译器会检测到 Test() 函数希望接收一个 Psz(),并立即创建 USUAL 到 PSZ 的转换。如果 usual 的内容是指针,则不会分配内存。当 usual 的内容是字符串时,将分配内存,用于保存从 Unicode 转换为 Ansi 后的 PSZ。

编译器不知道 Test() 函数将如何处理 PSZ,因此无法控制变量的生存期限。我们建议您修改代码,使用 String2Psz() 或 StringAlloc()。

当然,这些函数只有在通常包含字符串的情况下才会起作用,如上例所示。

FUNCTION Start() AS VOID
LOCAL uValue AS USUAL
uValue := "SomeString"
? Test(String2Psz(uValue))
? Test(String2Psz("AnotherString"))
RETURN
 
FUNCTION Test(p AS PSZ) AS STRING
RETURN Psz2String(p)

或者

FUNCTION Start() AS VOID
LOCAL uValue AS USUAL
LOCAL p as PSZ
uValue := "SomeString"
p := StringAlloc(uValue)
? Test(p)
MemFree(p)
p := StringAlloc("AnotherString")
? Test(p)
MemFree(p)
RETURN
 
FUNCTION Test(p AS PSZ) AS STRING
RETURN Psz2String(p)