在一段程序中,我使用StrAlloc和StrDispose来为一个PChar变量分配和释放内存,然后在DLL中将一些字符串写入PChar变量,接着将PChar变量的字符串保存到string变量中,代码如下:
- procedure Test;
-
var
-
p:PChar;
-
s:string;
-
begin
-
p := StrAlloc( 204800 * sizeof( Char ) );
-
//调用DLL函数,将字符串写入p
-
......
-
-
s := p;
-
//s := StrPas( p );
-
StrDispose( p );
-
-
//读取s中的值
-
end;
在我的程序中,以上代码放在的是一个循环体中,在大多情况下s的值是正常的,但s偶尔会多出一些字符串来,这些多出来的字符串也许是上一次给s赋的值,比如上一次p传给s的值是“123”,这一次是"abc",那么s的值就可能是“123bc”。
难道是DLL函数传给p的值没有加字符串结束符“\0”?但我测试了DLL函数,又没发现问题。
于是我又将StrAlloc和StrDisPose换成了GetMem和FreeMem,问题依旧。
以前在C++中,分配了内存都会用memset函数为填充字符串指针,于是在GetMem后加了个ZeroMemory函数,再做测试,发现问题解决了。
下面是解决后的代码:
- procedure Test;
-
var
-
p:PChar;
-
s:string;
-
begin
-
GetMem( p, 204800 * sizeof( Char ) );
-
ZeroMemory( p, 204800*sizeof( Char ) );
-
//调用DLL函数,将字符串写入p
-
......
-
-
s := p;
-
//s := StrPas( p );
-
FreeMem( p );
-
-
//读取s中的值
-
end;
问题虽然解决了,但没有去追根溯源,最后得出的经验是,给字符串指针分配内存后,一定要进行填充。
阅读(1527) | 评论(0) | 转发(0) |