以前用结构(Record)一直没注意要定义string的长度.因为以前没怎么出过错误.一直用的好好的.
但是悲剧昨天下午发生了.我的例子是这样的.首先我有2个自定义结构
  TLoginInfo = packed record
    btType: Byte;
    sUserName: string[15]; //之前是没有定义长度
    sPassword: string[32]; //之前是没有定义长度
  end;
  pTLoginInfo = ^TLoginInfo;  TThreadFunc = packed record
    btFuncID: Byte;
    Param: Pointer;
    Owner: TObject;
  end;
  pTThreadFunc = ^TThreadFunc;我的代码
        New(pLoginInfo); // 新建一个登录信息处理的内存指针
        if pLoginInfo <> nil then
        begin
          nCode := -5;
          pLoginInfo.btType := btType; // 赋值
          pLoginInfo.sUserName := sUserName; // 赋值
          pLoginInfo.sPassword := sPassword; // 赋值
          nCode := -6;
          g_DataBaseThread.NewDBFunc(DBFUNC_UL, pLoginInfo, Self); // 将该指针交给数据处理线程执行
        end
        else
          Raise Exception.Create('New(pLoginInfo) Failed');先申请了一个pTLoginInfo.接着g_DataBaseThread.NewDBFunc的时候又会申请一个pTThreadFunc.这时候如果pTLoginInfo的string没有定义长度.那么后面这个就会受一定的影响申请内存时偶尔会越界这个问题导致我昨天下午调试到刚才.现在总算解决了.不过要感谢2个朋友帮助我学习到了 事件堵塞(这个项目不打算用.还是继续用唤醒休眠的循环.那个还没完全掌握.昨天测试偶尔会泄露内存) 和 OutputDebugString
见帖:http://topic.csdn.net/u/20100719/16/e8d71d2b-21a9-4165-a7fc-88fc8ef84a3c.html?seed=1024582840&r=67095391#r_67095391没啥分了这个散40分吧..NND

解决方案 »

  1.   

    结构里的string,没有长度就是长字符串,在结构里只是保留了指针,短字符串才在结构里保留全部的内容
      

  2.   

    感谢分享关键就是传了指针(pLoginInfo)惹的祸
      

  3.   

    呵呵,我也遇到过这个问题,结构的string初始化时指针,string后面的参数会出现问题,所以string最好定义长度
      

  4.   

    在结构中不用string,用数组多好