Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417357
  • 博文数量: 54
  • 博客积分: 1186
  • 博客等级: 少尉
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 04:57
文章分类

全部博文(54)

文章存档

2013年(1)

2012年(6)

2011年(47)

我的朋友

分类: BSD

2011-04-19 16:22:26

在一段程序中,我使用StrAlloc和StrDispose来为一个PChar变量分配和释放内存,然后在DLL中将一些字符串写入PChar变量,接着将PChar变量的字符串保存到string变量中,代码如下:
  1. procedure Test;
  2. var
  3.     p:PChar;
  4.     s:string;
  5. begin
  6.     p := StrAlloc( 204800 * sizeof( Char ) );
  7.     //调用DLL函数,将字符串写入p
  8.     ......

  9.     s := p;
  10.     //s := StrPas( p );
  11.     StrDispose( p );

  12.     //读取s中的值
  13. end;
在我的程序中,以上代码放在的是一个循环体中,在大多情况下s的值是正常的,但s偶尔会多出一些字符串来,这些多出来的字符串也许是上一次给s赋的值,比如上一次p传给s的值是“123”,这一次是"abc",那么s的值就可能是“123bc”。

难道是DLL函数传给p的值没有加字符串结束符“\0”?但我测试了DLL函数,又没发现问题。

于是我又将StrAlloc和StrDisPose换成了GetMem和FreeMem,问题依旧。

以前在C++中,分配了内存都会用memset函数为填充字符串指针,于是在GetMem后加了个ZeroMemory函数,再做测试,发现问题解决了。

下面是解决后的代码:
  1. procedure Test;
  2. var
  3.     p:PChar;
  4.     s:string;
  5. begin
  6.     GetMem( p, 204800 * sizeof( Char ) );
  7.     ZeroMemory( p, 204800*sizeof( Char ) );
  8.     //调用DLL函数,将字符串写入p
  9.     ......

  10.     s := p;
  11.     //s := StrPas( p );
  12.     FreeMem( p );

  13.     //读取s中的值
  14. end;
问题虽然解决了,但没有去追根溯源,最后得出的经验是,给字符串指针分配内存后,一定要进行填充。
阅读(1542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~