由memcpy内存越界引发的问题 && delete 和 delete []的真正区别
今天遇到了一个问题,在程序运行到某处总会报访问到错误的地址的错误,而且每次报错的堆栈还都不一样,排查了一段时间,发现是memcpy这里出了错
char *d = new char[data.size() * ];
memset(d, , data.size() * ); memcpy(d,temp_content.c_str(), temp_content.size());
这里乍一看没什么问题,但是如果这里data字符串为空而temp_content不为空的话,memcpy这样调用就出现了错误。
虽然暂时不会报错,因为这里通过new char[0]申请到了一个内存地址的指针(这里虽然为0但至少应该申请到了1块),这样memset不会报错,即使memset(d, 0, 1000);大概率也不会报错,只要后面的这块连续的内存没被别人占用
所以memcpy(d,temp_content.c_str(), temp_content.size());这种向未申请的内存中写数据也不会报错,但是这样的操作会破坏未申请内存的数据结构,当下一次别的操作申请内存时,申请到被破坏的内存,程序就会报错崩溃了(程序是不会关心你这个指针用的内存属不属于自己,只会关心你有没有用别人的内存!!!)
最好用memcpy_s代替!
delete 和 delete []的真正区别
这个和上面的问题有一点关联度,就是malloc 和 new的时候需要指定申请内存的大小,为什么free和delete时不需要呢?
先解释delete和delete[]的区别,他们同样都会释放指针所指向的内存空间,但如果指针类型不是基本数据结构时,delete只会调用第一个数组内的析构函数,其他的数组成员的析构函数都不会被调用!!!
第二个问题的答案
在学内存分配的问题的时候,malloc和calloc都要指定需要分配内存的大小,但是free的就不需要,我就纳闷free是咋知道从指针地址开始的多少长度是被分配了的?
当时就想,在malloc或者calloc的时候,编译器应该把大小的数值放到哪个地方了,当free的时候就去找那个数值,释放掉数值大小的堆空间。
但是到底放哪呢?
前几天在网上一阵乱逛,说是现代编译器就是把大小的数值放在分配地址开始的之前位置,但是具体在之前多少位置呢?今天在vs的内存监视器里面看到了。
测试代码如下:
[cpp]
#include "stdlib.h"
#include "stdio.h"
#define Num 100
int main(void)
{
int i;
int *p=(int *)malloc(Num);
for (i=0;i<Num;i++)
{
*(p+i)=1; //赋值为1只是为了看起来方便
}
free(p);
return 0;
}
其中p的地址为0x00393220
接着打开vs2008的内存监视器窗口看:
有一个地址为0x00393210的很可疑,因为0x64=100
那么改一下看看:
[cpp]
#define Num 50
再看内存监视器:
看到*(0x00393210)=0x32;即0x32=50
那应该就是把大小放这里了,就是说距离分配地址0x10之前的位置。
从中可以看出为什么分配堆更号内存大小(当然它的主要方面还是“碎片”的产生)的一个小方面~~~
由memcpy内存越界引发的问题 && delete 和 delete []的真正区别的更多相关文章
- C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
当我们在用C++做底层驱动的时候,经常会遇到内存不足的警告,究其原因,往往是因为内存出现溢出,泄露或者越界等原因.那么他们之间有什么联系吗? 内存溢出(out of memory) 是指程序在申请内存 ...
- 使用PageHeap.EXE或GFlags.EXE检查内存越界错误 (转)
2011-05-27 20:19 290人阅读 评论(0) 收藏 举报 microsoftdebuggingstructureoutputimagefile 必先利其器之一:使用PageHeap.EX ...
- 使用PageHeap.EXE或GFlags.EXE检查内存越界错误
必先利其器之一:使用PageHeap.EXE或GFlags.EXE检查内存越界错误 Article last modified on 2002-6-3 ------------------------ ...
- 使用_snscanf_s转换十六进制时引起的内存越界
//将Hex编码转换为指定编码格式的字符串 string Encoding::DecodeHexString(const string &strSrc, UINT code_page ) { ...
- Windows下使用Gflags检查内存越界
环境:windows xp. vs2005 Gflags可用于查找内存越界的问题. 访问一块申请的内存时,当访问的地址超过申请的范围时,就发生了内存越界的问题. 编写测试程序MemoryOverflo ...
- C基础 内存越界和内存监测的简单处理
引言 突然感觉要出去走走了, 醒了后 刷完牙就在联系coding, 不知不觉到了 黄昏. 看看天, 打开灯. 又感觉到了 夜夜夜夜 . 13年到北京务工, 遇到一批批NB的同龄人物. 一块工作, 一块 ...
- C++多线程下出现内存越界问题总结
工作中遇到这样一个问题,某个多级流水多线程的程序,在压力测试下会偶现segmentation fault11错误,错误出现在运行类函数的地方,而后排查后发现是由于多线程争抢导致类被析构后才走入判断,导 ...
- 一次"内存泄漏"引发的血案
本文转载自一次"内存泄漏"引发的血案 导语 2017年末,手Q春节红包项目期间,为保障活动期间服务正常稳定,我对性能不佳的Ark Server进行了改造和重写.重编发布一段时间后, ...
- IOS上解决内存越界访问问题
IOS经常会混合使用C代码,而在C中,对内存的读写是很频繁的操作. 其中,内存越界读写 unsigned char* p =(unsigned char*)malloc(10); unsigned c ...
随机推荐
- unity2018使用tileMap生成地图 类似泰拉瑞亚创建和销毁地图块
参考网站:https://blog.csdn.net/pz789as/article/details/79540890 using System.Collections; using System.C ...
- 配置nginx服务器全局命令
service nginx start|stop|reload 报错:Failed to reload nginx.service: Unit not found.[解决方案] 在执行service ...
- NOPI 导出 Excel 2007
代码: public static void ThisTo<T>( List<T> source, string[] colums, Func<T, object[]&g ...
- JavaScript中Undefined 和 Null的区别
Undefined 这个值表示变量不含有值. 可以通过将变量的值设置为 null 来清空变量. 例如: <script> var person; var car="Volvo&q ...
- 异步http请求的实现
这是我自己在某论坛上发的一篇水贴:http://www.sufeinet.com/thread-9275-1-2.html,原理和解释,我就直接重发一遍在自己博客上了. 时隔一个月 回来把之前的坑填 ...
- Vue(五)--组件
1.组件也需要进行注册才可以使用:分为局部注册和全局注册 <body> <div id="app" > <my-component></m ...
- office2007安装时显示安装程序找不到 office.zh-cn\officeLR.cab怎么办
根本原因是和VS2008有关解决方法如下:1. 找到vs2008安装程序(光盘,镜像文件,解压文件都一样),找到WCU文件夹在他里面找到WebDesignerCore文件夹,然后打开它找到WebDes ...
- AndroidVideoCache 框架源码分析
1.简析: 在客户端播放视频的使用,容易出现这样的一个问题.在网络状况不好的情况下,视频流很容易卡顿或者中断,即使播放软件本身有一点的缓存能力,但是这个往往不够,造成播放失败,卡顿. AndroidV ...
- php查找字符串中第一个非0的位置截取
$str = '00000000000000000000000000000000000000001234506'; $preg = '/[0]*/'; $result = preg_replace($ ...
- js两个字符串明明一样却判断显示不相等
一.问题 两个字符串看起来一样.类型一样,判断str1==str2时返回false: 二.原因 字符串可能含有其他特殊字符:换行符(%D).空格(%20)...一般不显示. 三.如何判断 encode ...