我定义了一个动态的字符数据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;

解决方案 »

  1.   

    是否在用线程监听,当收到信息后应该让另外一个线程执行操作,操作不要放在主线程中。
    if(pEnd='end') then break; 
    if(size>0) then Tnewtread.create(可以用接受到的数据做参数);
      

  2.   

    这个地方没错,出错的代码在setlength上
      

  3.   

    var
      pData: array of char;
    这个变量是全局的?局部的?事实上,这个变量用动态数给还不如用强类型:String!不过在通讯中,如果访问很频繁的话,最好用静态数组。
    const
      BUFFER_SIZE=255;
    type TData:array [0..BUFFER_SIZE] of char;
    var
     pData:TData;
    且把这个作为一个全局的变量;线程访问时,你最好用临界区来保护这个共享缓冲区;线程访问时,通过指针访问。
    如果不这样,很有可能会是多个线程同时访问这一个缓冲区,极易造成内存地址访问错误!
    你的代码中更容易出这样的错!因为你重新分配内存。如果多个结程同时访问(没有临界区保护的情况下)这个缓冲区,你就程序就报错了。内存访问出错,线程崩溃,引起应用程序崩溃是很平常的。相关的线程操作请查帮助。