其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug
2015-06-27 20:37
393 查看
1、代码如下:
string src ="abcdabcd";
char* dst = new char[8];
strcpy(dst,src.c_str());
delete[] dst;
2、在release模式下,报错 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug。
3、原因是,src的长度为9,包含一个字符结束符0(不是字符0,而是取值为0,也就是NULL),对于dst,new出来的长度不够,copy的时候踩了内存,踩了一个字节的内存,堆被损坏,delete[]的时候崩溃。
4、那么问题来了,为什么Debug的时候,不会崩溃?
这是因为,Debug模式下,内存前后各多出4个字节,用于调试信息。踩到这部分的内存不会导致崩溃。测试如下:
char* dst = new char[5]; 不会崩溃,因为只踩到了Debug的内存,没有踩到其他对象内存。
char* dst = new char[4]; 崩溃,因为踩到了Debug的内存,还有一个字节踩到了其他对象的内存。
5、memcpy也是同样道理,拷贝踩了内存,导致堆破坏,delete[]的时候崩溃。
string src ="abcdabcd";
char* dst = new char[8];
strcpy(dst,src.c_str());
delete[] dst;
2、在release模式下,报错 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug。
3、原因是,src的长度为9,包含一个字符结束符0(不是字符0,而是取值为0,也就是NULL),对于dst,new出来的长度不够,copy的时候踩了内存,踩了一个字节的内存,堆被损坏,delete[]的时候崩溃。
4、那么问题来了,为什么Debug的时候,不会崩溃?
这是因为,Debug模式下,内存前后各多出4个字节,用于调试信息。踩到这部分的内存不会导致崩溃。测试如下:
char* dst = new char[5]; 不会崩溃,因为只踩到了Debug的内存,没有踩到其他对象内存。
char* dst = new char[4]; 崩溃,因为踩到了Debug的内存,还有一个字节踩到了其他对象的内存。
5、memcpy也是同样道理,拷贝踩了内存,导致堆破坏,delete[]的时候崩溃。
相关文章推荐
- Java IO流 字节流与字符流
- Sql入门-----------子查询
- 排序算法之选择排序
- 安装CouchDB
- Comet:基于 HTTP 长连接的“服务器推”技术
- C++ 13.2 类赋值操作符----定义该类型对象赋值时会发生什么(有不懂)
- java命令中的classpath参数
- 插入排序
- [CodeForces550C]Divisibility by Eight[数学]
- Effective C++ 条款25
- Visual Studio跨平台开发(2):Xamarin.iOS基本控制项介绍
- 黑马程序员——java基础之面向对象
- 微软 Web 开发工具 WebMatrix
- StarUML使用说明-指导手册
- SQL Server 创建约束图解 唯一 主键
- java学习之旅30--面向对象_03_类和对象的关系_写出我们的第一个类
- (译)如何在sql中选取每一组的第一行/最后行/前几行
- 欢迎使用CSDN-markdown编辑器
- 项目中的设计模式【工厂方法模式】
- mysql编程语法