生死疆界(上)--- 在new与delete之间

问题源自一段简单的代码:

void main()
{
char *p = new char;
cin>>p;
cout<<p[2];
delete p;
}

在以上代码中,如果你输入:abcd,那么如你所望,你会看到"正确"的输 出"c"。但是会有错误提示出现:

Debug Error!

Program: test.exe

DAMAGE: after Normal block(#64) at 0x003429f8

更离奇的是,如果将代码改为如下的代码:

void()
{
char *p = new char;
cin>>p;
cout<<p;
delete p;
}

如果只输入一个字符a,那么依然报错。是不是奇怪,分配了一个字符,输入了一个 字符,那么错在哪里? 注意,最开始那行Debug Error!说明这是在Debug编译模式下才有的 提示,如果你换到release频道,那么此提示不再出现,你成功得到了"c",仿佛 程序一切正常。

一个奇怪的现象是,如果去掉delete p这条语句,这个运行时错误消失了,甚至你在 debug模式下也看不到这个提示。 问题何在?

以前我遇到过这种情况,分析后归结为一个结论:在debug模式下系统有一定的机制侦测 到内存的非法访问。然后就放过这个问题。这个结论说了等于没说,关键在于,这种机制的 具体运做过程。这次我下了狠心,不入虎穴,焉得虎子。我决定追进源代码里边去。 把编译 环境设置成debug模式,很显然,问题出在delete p上,在这条语句设置断点,按F5,程序运 行到这条语句前自动暂停,然后按F11。

Welcome to the Source Code World!

首先来到DELOP.CPP文件中,这个文件短小精悍,只有一个函数

void __cdecl operator delete(void *p) _THROW0()
{ // free an allocated object
free(p);
}

没有任何有用的信息,那就继续追进free(p)里。 不一会,我们追到了DBGHEAP.C 中,你从文件名可以看出,这是在debug模式下才能进入的文件。

时间: 2024-12-05 06:04:40

生死疆界(上)--- 在new与delete之间的相关文章

生死疆界(下)--- 在new与delete之间

上回<生死疆界(上)>说到: 咱们对着微软在背后做的手脚深感困惑,于是备好车马粮草 ,一路追杀进去,最后走进了死胡同,剩下的最后希望就是在这里摸摸,那里敲敲,看有没 有暗藏机关. 这正是:探源码身陷绝境,求解脱心系参数. 还记得我们在delete p;前设的断点吗?好,让我们重新开始调试,按F5,从控制台输入 "abcd",然后到这条语句前停止了,查看变量p的值,是0x00342c40,那好,打开 vc监视内存的窗口memory,我们查看这个地址的值: 此后的内存情况不再用

c++-malloc、free、new、delete之间的关系,动态内存原理?

问题描述 malloc.free.new.delete之间的关系,动态内存原理? 想问的有很多,比如:堆的本质是什么?是一个类似指针链表的东西吗? 当[new int [100]]时,这个数组的内存地址是不是连续的一大整块?如果不连续,那么分配的时候又是如何跳跃的? 在delete这个数组时,编译器怎么知道要删除的内存有多大,删除完A地址后,编译器又怎么知道下一个要删除的是B地址? 还有,new []和delete可以配套使用吗? 解决方案 楼主请进传送门:http://www.perfect-

在android应用层上,多个app之间如何实现主题、样式和图片等资源?

问题描述 在android应用层上,多个app之间如何实现主题.样式和图片等资源? 本人近段正在修改android应用层的UI,需要修改一些安卓自带的app样式:在修改的过程中发现有很多样式都引用系统framework层的资源,但是如果直接进入framework里修改样式的话,会影响到第三方app的效果.所以本人想询求,有没有什么好的方法,可以在应用层定义一套公共的资源,让不同的app引用,不会影响到framework层资源.补充一下:最好是像framework资源那样,当修改公共资源并编译入机

线上营销与网页颜色之间你不可不知的那些事

或许身为站长的你可能很清楚网站的颜色会影响到用户的体验.但你是否知道网站的颜色也和站点的营销有着千丝万缕的关系.那么对于营销来说重要在何处呢?有的人说美观,网站美观了,消费者自然可以赏心悦目的在我们的站点上消费.的确如此,但是这只是其中的一小点而已,更为关键的是网站的颜色往往可以影响到消费者的购买决策,能够起到暗示消费者的心理作用.这点听着有点玄乎,下面笔者就通过几个简单的实例来谈谈颜色与站点营销之间那些你不可不知的事. 在我们开始分析网站颜色与站点的营销关系之前,我们先来看看几组数据.该数据是

谈线上营销与网页颜色之间你不可不知的那些事

中介交易 SEO诊断 淘宝客 云主机 技术大厅 或许身为站长的你可能很清楚网站的颜色会影响到用户的体验.但你是否知道网站的颜色也和站点的营销有着千丝万缕的关系.那么对于营销来说重要在何处呢?有的人说美观,网站美观了,消费者自然可以赏心悦目的在我们的站点上消费.的确如此,但是这只是其中的一小点而已,更为关键的是网站的颜色往往可以影响到消费者的购买决策,能够起到暗示消费者的心理作用.这点听着有点玄乎,下面笔者就通过几个简单的实例来谈谈颜色与站点营销之间那些你不可不知的事. 在我们开始分析网站颜色与站

IA架构上实现云计算和虚拟化之间的区别

微软发布了微软system center产品之一Virtual Machine Manager(虚拟机管理器,VMM)的Beta版,希望能够在与VMware的竞争之中重新获得用户的信心. system center是面向微软服务器的管理软件套装产品之一,它的第一个版本Microsoft system center Operations Manager 2007于三月发布,随之发布的还有附属软件system center Configuration Manager 2007,现在这套软件已经进入了

mysql select delete-求大神解!同样条件SELECT和DELETE在MYSQL上执行发生怪事

问题描述 求大神解!同样条件SELECT和DELETE在MYSQL上执行发生怪事 DELETE FROM TB_VALIDATE_PARAM WHERE UPPER(CONCAT(c_object_id, c_column_code)) NOT IN ( SELECT UPPER(CONCAT(COL.TABLE_NAME, COL.COLUMN_NAME)) FROM information_schema.COLUMNS AS COL WHERE COL.TABLE_SCHEMA = 'jli

三层交换机与路由器之间的区别

近年来随着Internet/Intranet的迅猛发展和B/S计算模式的广泛应用,跨地域.跨网络的业务急剧增长,业界和用户深感传统的路由器在网络中的瓶颈效应.而三层交换机既可操作在网络协议的第三层,起到路由决定的作用,又具有几乎达到第二层交换的速度,且价格相对较低.一时间,三层交换机将取代路由器成为网络界最流行的话题.但事实果真如此吗? 传统的路由器在网络中有路由转发.防火墙.隔离广播等作用,而在一个划分了VLAN以后的网络中,逻辑上划分的不同网段之间通信仍然要通过路由器转发. 由于在局域网上,

在Linux系统上安装配置DNS服务器的教程

  简介 DNS 是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器.其中域名必须对应一个IP地址,而IP地址不一定有域名.域名系统采用类似目录树的等级结构.域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器.将域名映射为IP地址的过程就称为"域名解析".在Intern