none
一个内存数据丢升的问题 RRS feed

  • 问题

  • 我在备份编约会信息的时候有一个recipients的接口要保存到EDB数据库里,我就用一个blob去存它.

    用的是写索引的方法,先用一块固定大小的区域去写将要保存的值的长度,在扩展一块这么长的区域去保存这个值.但是第二次循环的时候就会丢掉一些数据.

    大概是这样的:

     

    pRecs->get_Count(&index);

     

    for(int i = 1; i <= index; i++)

    {

    pRecs->Item(i, &pRec);

    pRec->get_Name(&name);

    .....

    //把name写到字符串中valueStr,并得到他的长度valueLen

    ....

     

    pOld = (PBYTE)realloc(*pBlob, 6);     //pBlob是从外面传进来的一个BYTE ** 就是要往这里面写值,pOld也指向这块区域,但专门用来操作数据,以防在操作时丢失数据.

     

    if (!pOld)

        return false;

    else

    {

    *pBlob = pOld;

    pOld += dwCount;    //dwCont是当前pBlob的长度.

    }

     

    memset(pOld, 0, valueLen);

    CopyMemory(pOld, valueStr, valueLen);

     

    dwCount += valueLen;

    ......

    }

    一个写值的过程大概就是这样了.

    循环第一次的时候基本上没有问题,索引也写进去了,值也写进去了.

    但第二次的时候,到第一个扩展内存空间的时候值就会掉丢几位,但索引不会有问题.而这次要写的值却正常写进去了.

     

    VS2005 + WM6.0

     

    请问这是为什么?

    谢谢.
    2008年8月17日 14:45

答案

  •  

    可能是你的某个变量分配的空间不够造成的。我原来在做SMS备份的时候,初始分配用来保存SMS正文的变量只分了150,结果测试的机器中有条SMS的正文长度是200+Unicode,结果程序运行不抱错,但是这条SMS之后的SMS读取全部数据丢失。
    2008年8月19日 6:41