我定义了一个动态的字符数据pData,每次从服务器接收到数据时会启动一个线程,当启线程时都会根据取得的数据为这个pData分配内存,但是当接收几次后当运行到setLength(pData,lastSize+size);时就会报内存写错误并导致程序崩溃,(几次是随机的,不确定),希望高手能帮助我介绍这个问题,急等.
代码如下:var
pData: array of char;
size:=frmMain.sock.Socket.ReceiveBuf(pTemp,MAXSIZE);
if(size>0) then
begin
zeromemory(@pEnd[0],3);
copymemory(@pEnd[0],@pTemp[size-3],3);
setLength(pData,lastSize+size);
copymemory(@pData[lastSize],@pTemp,size);
lastSize:=lastSize+size;
if(pEnd='end') then
break;
end;
代码如下:var
pData: array of char;
size:=frmMain.sock.Socket.ReceiveBuf(pTemp,MAXSIZE);
if(size>0) then
begin
zeromemory(@pEnd[0],3);
copymemory(@pEnd[0],@pTemp[size-3],3);
setLength(pData,lastSize+size);
copymemory(@pData[lastSize],@pTemp,size);
lastSize:=lastSize+size;
if(pEnd='end') then
break;
end;
解决方案 »
- 强烈鄙视云峰工作室弄的王码五笔86版64位 2013.3 win8
- 检索重复记录错误
- Treeview节点数据
- 一个在程序中产生EXCEL文件的问题
- 一个常见的问题:用MD5加密,返回16位的字符串
- 最基本的,谢谢
- Dll里面Indy HTTP Client的调用
- 在DBGrid中如何获取当前选中单元格的位置??? 解决了马上给分。。。
- DateTimePicker的一个问题?
- 用文本框如何显示小数?????什么函数???
- 用RegisterHotKey注册一个F12的热键,但总是返回false
- 用Ole DB Provider for Microsoft Directory Services能连接一个*.edb的数据库文件,可不知道用什么将内容显示出来。
if(pEnd='end') then break;
if(size>0) then Tnewtread.create(可以用接受到的数据做参数);
pData: array of char;
这个变量是全局的?局部的?事实上,这个变量用动态数给还不如用强类型:String!不过在通讯中,如果访问很频繁的话,最好用静态数组。
const
BUFFER_SIZE=255;
type TData:array [0..BUFFER_SIZE] of char;
var
pData:TData;
且把这个作为一个全局的变量;线程访问时,你最好用临界区来保护这个共享缓冲区;线程访问时,通过指针访问。
如果不这样,很有可能会是多个线程同时访问这一个缓冲区,极易造成内存地址访问错误!
你的代码中更容易出这样的错!因为你重新分配内存。如果多个结程同时访问(没有临界区保护的情况下)这个缓冲区,你就程序就报错了。内存访问出错,线程崩溃,引起应用程序崩溃是很平常的。相关的线程操作请查帮助。