今天遇见一个超郁闷的BUG,现象非常奇怪:
delete pointer;
删除一个指针的时候程序发生core dump,或者在此处挂死。
从原理上分析,new出来的一块内存,会在内存的头或者尾处加上一个标记,说明块内存的大小。
我猜想,一定是指针越界,导致了开始或者末尾的这块标记被破坏,所以delete发生挂死。
检查了若干次后,也没发现指针越界的情况。
而且单独写了一个程序来故意破坏new出来的内存块的开头和结尾,结果指针越界的时候,程序立即core dump,说明Linux操作系统明确禁止了越界的指针。
实在没办法,采用逐行注释的办法,最终定位到一个一行代码上。检查这行代码所在的类,仍没发现这个方法有问题。
于是把这个类单独提取出来,模拟同样的new和delete操作,最后才发现是Close()方法中,delete掉一个内部的指针后没有赋值为NULL,然后析构函数中又调用Close(),导致一块内存连续被释放两次。
奇怪的是,这个类发生的内存问题,并没有在第二次delete的时候发生问题,而是在我自己的代码中,delete另一个指针的时候发生挂死————我取名为堆破坏。如果不阅读LINUX的源码,还没办法说明为什么会这样。
还奇怪的是,我当时调试用的LINUX服务器是2.4内核的,当把有问题的代码放到2.6内核的服务器上调试时,完全没问题,看来linux 2.6内核能够对两次delete同一指针的问题进行容错。
说了那么多,总结一下:注意,Linux 2.4内核的操作系统中,两次delete同一内存后,将发生堆破坏,再次delete其他指针的时候可能发生core dump或者挂死!
分享到:
相关推荐
环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386 GNU/Linux...在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。 全部编译是很痛苦的过程
在本项目中,"我的日常小记:spring以及mybatis最终源码" 是一个记录了开发者个人编程经验的项目,主要涉及两个核心框架——Spring和MyBatis。这两个框架是Java开发领域中非常流行的技术栈,广泛应用于企业级后端...
### 工作小记:企业微信嵌H5页面用户权限获取匹配 #### 一、背景与目的 在当前数字化转型的大背景下,企业越来越多地利用移动互联网技术来提升工作效率和服务质量。其中,企业微信作为一种重要的办公协作平台,在...
对于3D打印项目,Linux环境下的开源工具如Slic3r或Cura能够将3D模型转换为可供3D打印机理解的G代码。 Java是一种广泛使用的面向对象的编程语言,可以用于创建3D建模软件或处理与3D打印相关的后处理任务。例如,你...
但是经过查阅资料windows系统安装到硬盘,随身携带到别的机器启动,多数情况下不能正常运行,而且报错,还有驱动等等一系列问题,所以我想到linux,总体思路是安装linux,在linux下用虚拟机安装winx
### C++11 新特性详解 #### 一、Auto 关键字的新用途 - **旧用途**:在C++11之前,`auto`关键字主要用于指定变量的存储期。 - **新用途**:C++11引入了类型推断的概念,`auto`变成了一个类型占位符,用于告诉...
在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...
以下是对标题"数据字典-小记及用户部分1"中所提及的数据元素进行的详细说明: 1. 用户数据元素: - **账号**:用户ID,类型为int,长度11,用于唯一标识每个用户。 - **密码**:字符串类型,长度20,存储用户登录...
vue2 项目 + webpack 打包工具,是一个非常经典的组合,但是在...小记:这只是配置的 package.json 文件,更有配置好的 webpack.config.js 文件,以及整个完整的 vue2+webpack5 整个的项目,因为上传的规定可以找我来拿
vue2 项目 + webpack 打包工具,是一个非常经典的组合,但是在...小记:这只是配置的 package.json 文件,更有配置好的 webpack.config.js 文件,以及整个完整的 vue2+webpack4 整个的项目,因为上传的规定可以找我来拿
在Linux世界中,Ubuntu是一个非常流行的开源操作系统,以其用户友好性和丰富的软件库而闻名。这篇“Ubuntu安装小记”可能会涵盖如何在个人计算机上安装Ubuntu系统的步骤,以及可能遇到的一些问题和解决方法。安装...
随笔小记.doc
例如,`os.makedirs("./data")` 将会在当前目录下创建名为"data"的文件夹。如果目录已经存在,`makedirs()`通常不会报错。为了确保不存在时才创建,可以编写一个函数,如`makedir(new_dir)`,它首先检查路径是否存在...
GeoStudio学习小记
8. **排序**:排序算法是数据处理的核心,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。不同的排序算法在时间复杂性和稳定性上有不同特点。 在C++实现这些算法时,需要注意面向对象编程的思想...
这篇文章是关于一种名为“咬人草”的植物的描述和作者对其独特特性的体验与思考。咬人草在新疆地区生长,是一种看似普通的草本植物,却有着不寻常的防御机制——它的叶瓣上有尖锐的小刺,一旦触碰,就会像被毒蜂蜇...
在Windows环境下部署Apache Tomcat服务器是一项常见的任务,尤其对于开发和测试环境来说。在这个过程中,可能会遇到各种问题,本文将详细解析如何在Windows系统中部署Tomcat项目,并着重解决两个常见问题:数据库不...
标题“海居小记_csdn”中的“csdn”指的是中国知名的IT社区和技术交流平台“CSDN”,而“海居小记”似乎暗示着作者孙钢坪在海边居住时的所见所感,很可能是与海相关的生活笔记或游记。 描述“海居小记”并未给出...
本章节将重点围绕104规约的学习小记,包括固定长度报文的基本结构、常见帧的类型、报文示例及总召唤命令等几个方面进行详细解析。 #### 二、固定长度报文 固定长度报文是104规约中的一种基本报文形式,其结构相对...
《RMAN使用小记》 Recovery Manager(RMAN)是Oracle数据库系统中用于数据恢复和备份的关键工具。本文将详细介绍RMAN的一些核心特性和使用方法,帮助读者理解和掌握RMAN的基本操作。 首先,了解RMAN的三个重要特性...