关于c++ 中内存拷贝 内存写超的情况分析

来源:互联网 发布:数据库原理经典书籍 编辑:程序博客网 时间:2024/06/16 18:09
void CBaseFunction::NewParamData(eint nMsgCode,eint8** ppParam,eint nLen)
{
            VisionBingoMessage* psBingoData = NULL;

            EASSERT(sizeof(VisionBingoMessage)==nLen);

            psBingoData = new VisionBingoMessage;
            memcpy(
psBingoData,*ppParam,nLen);

            psBingoData->nLength=((VisionBingoMessage*)(*ppParam))->nLength;
            psBingoData->pnBoardStatus = (eint32*)malloc(sizeof(eint32)*(psBingoData->nLength));
            memcpy(psBingoData->pnBoardStatus,
                   ((VisionBingoMessage*)(*ppParam))->pnBoardStatus,
                   sizeof(eint32)*(psBingoData->nLength));
            psBingoData->pvCornorPointsLists = new vector<VisionMarker>;
            *psBingoData->pvCornorPointsLists = *(((VisionBingoMessage*)(*ppParam))->pvCornorPointsLists);

    return;(这段代码已经被改过,是没有问题的!)
}
函数功能解释:
将传进来的数据拷贝一份;
      在程序中
memcpy(psBingoData,*ppParam,nLen);这里的nlen必须是VisionBingoMessage结构体的长度(即sizeof(VisionBingoMessage)),而不是数据包的长度(因为结构体里有指向数组和vector的指针,所以数据包的长度肯定比结构体的长度要大);
      至于原因,是这样的,

            psBingoData = new VisionBingoMessage;
            memcpy(
psBingoData,*ppParam,nLen);

用new分配内存的时候,编译器会告诉操作系统分配一个跟
psBingoData所对应类型一样长度的内存,即sizeof(VisionBingoMessage).
而下面memcpy时,如果nlen>
sizeof(VisionBingoMessage).就会写超.
      写超之后,当再分配内存时,操作系统会从
VisionBingoMessage长度之后紧接着的一块内存开始分配,而这时操作系统发现这块内存已经被写过了,程序就会崩!
原创粉丝点击