关于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长度之后紧接着的一块内存开始分配,而这时操作系统发现这块内存已经被写过了,程序就会崩!
{
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长度之后紧接着的一块内存开始分配,而这时操作系统发现这块内存已经被写过了,程序就会崩!
阅读全文
0 0
- 关于c++ 中内存拷贝 内存写超的情况分析
- 关于C/C++中内存分配(写的非常好,值得一看)
- 分析内存的使用情况
- 分析内存的使用情况
- 分析内存的使用情况
- 写内存拷贝
- 汇编写的内存拷贝函数
- 汇编写的内存拷贝函数
- C++/C中内存分配情况详解
- C++/C中内存分配情况详解
- 【操作系统】Linux中C程序的内存分布情况
- C中一道关于内存的思考题
- 关于C中内存存储的理解
- C语言中关于内存的分配
- C语言中内存以及堆栈情况
- 关于CUDA零拷贝内存的实验
- 关于JAVA中String类型内存关系分析c
- C-不用任何库函数,写一个内存拷贝函数
- Appium之Mac配置Appium全过程
- 编译错误 jump to case label [-fpermissive]
- c++ 深浅拷贝
- 模拟退火算法
- Android窗口机制分析与UI管理系统
- 关于c++ 中内存拷贝 内存写超的情况分析
- c++ 中字节对齐
- 编辑器、编译器和链接器的概念和区别
- 关于C++中的局部变量
- C++中两种参数传递方式 :值传递和传指针
- python 字典中取值的两种方法
- C++中含参构造函数的类对象做成员变量的方法
- 机器人软件平台ROS
- 最近关于调试一些心得,和离奇的案例