关于c++ 中内存拷贝 内存写超的情况分析
2017-06-19 10:16
337 查看
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长度之后紧接着的一块内存开始分配,而这时操作系统发现这块内存已经被写过了,程序就会崩!
{
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长度之后紧接着的一块内存开始分配,而这时操作系统发现这块内存已经被写过了,程序就会崩!
相关文章推荐
- C++中 关于多维数组在计算机内存中的分配情况
- 关于Android最佳性能实践——分析内存的使用情况学习笔记
- 关于今年我身边就业情况的客观陈述及弱分析
- 关于C/C++中指针做形参的一点小分析
- 关于C++内存的一点解释。
- c++中关于内存的一些问题
- 『原创』用C++开发WM应用系列(7)——查看内存、电量情况
- C++中函数中参数和返回值都是用户定义类型(这里主要是类的情况时的分析)
- c++中关于”深拷贝“
- 关于C++的类对象,内存分布问题
- 嵌入式C++——关于C++的效率分析
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- 我的C++ (三) - 空类/结构内存占用情况
- C++的=运算符重载并非简单内存拷贝
- 关于C++内存问题(转)
- 关于C++的类对象,内存分布问题
- 关于c++的学习情况,不再更新了,因为找到了更好的笔记记录工具
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- 关于java中的内存分析-堆和栈【收集资料】
- 嵌入式C++——关于C++的效率分析(顶嵌开源)