C++ new到底new什么

9: int *obj = new int(6);
00F714CE push 4 //压栈
00F714D0 call operator new (0F711EAh) //调用new函数返回分配的地址addr --- 0F711EAh是指令 jmp operator new 的地址
00F714D5 add esp,4 //恢复栈
00F714D8 mov dword ptr [ebp-0F8h],eax //把返回的地址addr赋给起始地址为ebp-0F8h的内存空间
00F714DE cmp dword ptr [ebp-0F8h],0 //判断分配是否成功
00F714E5 je main+51h (0F71501h)  //如果不成功跳往0x0F71501h
00F714E7 mov eax,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给eax
00F714ED mov dword ptr [eax],6 //把以起始地址为eax的内存空间(addr)置成6
00F714F3 mov ecx,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给ecx
00F714F9 mov dword ptr [ebp-100h],ecx //ecx的值(addr)赋给起始地址为ebp-100h的内存空间
00F714FF jmp main+5Bh (0F7150Bh) //无条件跳转到0x0F7150B
00F71501 mov dword ptr [ebp-100h],0 //起始地址为ebp-100h的内存空间置为0---分配失败的情况
00F7150B mov edx,dword ptr [ebp-100h] //起始地址为ebp-100h的内存空间(addr)赋值给edx
00F71511 mov dword ptr [obj],edx  //把edx的内容(addr)赋值给obj为起始地址的内存空间a
10: delete obj;
00F71514 mov eax,dword ptr [obj]  //把obj为起始地址的内存空间送往eax
00F71517 mov dword ptr [ebp-0ECh],eax //eax送往以ebp-0ECh为起始地址的内存空间
00F7151D mov ecx,dword ptr [ebp-0ECh]  //以ebp-0ECh为起始地址的内存空间送往ecx
00F71523 push ecx //ecx压栈
00F71524 call operator delete (0F710A0h)
00F71529 add esp,4
11:int *obj2 = new int(7);
与分配obj相同

  

此时输出*obj,会得到“7”。

why? obj本来是指向分配的地址addr_obj, 删除操作就是删除掉addr_obj中的内容,释放addr_obj内存,但是obj本身还是指向它的

当我们给obj2分配空间时,new函数会返回第一个可用的地址,也就是刚才释放的addr_obj,此时obj仍然指向该地址,所以得到上述结果。

这样做虽然偶尔会正确,但是后患无穷!!!

addr的经过的地方

eax -> ptr [ebp-0F8h] -> ecx ->  ptr [ebp-100h] -> edx -> ptr[obj]

 

new函数所要做的

1. 调用对象的构造函数,分配空间,返回地址addr

2. 把返回的地址addr赋值给指针对象

时间: 2024-10-23 07:53:43

C++ new到底new什么的相关文章

前端里移动端到底比pc端多哪些知识?

前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何? 我做过几年的web前端开发,就简单谈谈自己的感受吧. 首先来看看PC端和移动端在前端开发上的一些区别: (1)PC考虑的是浏览器兼容性,移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器用的都是webkit内核,所以做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化: (2)在部分事件的处理上,移动端自然是偏向于触屏的,所以触屏事件的一些规律要多摸索一下,

自动化测试到底是什么

引子 偶然在群里有人问自动化测试到底是啥,搞不懂.qtp对象库好麻烦,jmeter怎么做测试....一堆一堆的问题.其实说实话真心不知道该咋解答了,我的内心是累的~ 突然想到自己的新书里不就解释过这些吗!看来还是很多童鞋对于自动化测试的认知存在巨大的问题啊! so,以下内容选择<小强软件测试疯狂讲义> 重新认识性能测试之后我们再来看看自动化测试到底是什么.其实这个话题我在不同的场合多次谈过,甚至在我创办的"挨踢脱口秀"中也专门做了一次节目来说明,但可惜的是仍然有很多朋友对自

听说很多公司安装了电脑监控软件,到底是为了什么?

听说很多公司安装了电脑监控软件,到底是为了什么?企业安装公司电脑监控软件并不是为了监控员工上班在跟谁qq聊天.聊些什么内容.在看什么网页--.而是借用公司电脑监控软件为管理工具,通过软件规范和管理员工,提高工作效率. 1.指导和培训员工 比如通过安装公司电脑监控软件,利用实时画面监控,在管理端实时查看员工工作过程,以此了解该员工具体工作是否存在不足,对其进行有针对性的指导和培训 2.提升销售员沟通能力 比如在电脑监控软件管理端,可以看到被控端员工电脑与客户聊天过程和聊天记录,管理者可以找出其中沟

到底是 Activity 被回收了还是进程被杀死了?

不管是安卓的官方文档还是源码注释,处处可见"从 Activity A 跳到 Activity B,当系统内存不足时 A 可能会被回收--",而且没有明确说明 A 和 B 是否属于同一个 app 或进程. 但是,在官方给的 Activity 生命周期图中,却说内存不足时低优先级的进程将被杀死. 那么,内存不足时,到底是 Activity 被回收了呢,还是进程被杀死了呢,还是二者都出现了呢? 答案是,Activity 被回收了,而且进程被杀死了,而且该进程是后台进程. 默认情况下,一个 a

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

最大的幻术-游戏开发-到底是先学游戏引擎还是先学游戏编程

学习游戏的目的 我们学习游戏制作,游戏开发,游戏编程,游戏XX,我们的目的只有一个,打造一个非常牛逼,非常屌,非常让人开心的虚拟体验.我们用自己的学识让玩家在虚拟世界征战,生活,一步一步的让玩家幸福!那么我们的目的只有一个,让玩家知道自己的幸福在哪里,并且学会追求自己的幸福.当然,每个人对幸福的定义不一样.那么,我们只好让玩家来体验我们所来表达的最通俗的,最普遍的幸福体验,然后慢慢引导玩家去寻找自己的幸福体验.可能,在最后玩家都会离开游戏,离开虚拟世界,(对,这是真的,玩家需要一步一步达到定点,

null?对象?异常?到底应该如何返回错误信息

这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: 1 if (foo() == null) { 2 3 } 当然,这位老师是一位比较擅长c/c++的老程序员,所以他的代码其实使用c写的.但是意思和这段代码类似.当时,我很好奇为什么要对一个方法的返回值是不是null进行判断.现在当然很清楚了:在很多win32的API里面,是通过返回值为null来传递"函数调用失败"这一种信息的. 那么,这么做好吗? 我翻看了很

涉嫌垄断的App Store,到底做了什么让开发者暴怒

什么行业最赚钱?不是你想象中的餐饮.互联网.钻石,而是垄!断!行!业!不管是垄断什么,只要一家独大,就能任意制定价格和游戏规则,将利益最大化.还有掌控整个链条上参与者的"生杀大权",不亦快哉!但一旦玩过火,也会激起激烈的反抗.而近日,苹果App Store就成为了众矢之的. 限于苹果App Store近段时间以来的"疯狂压迫",不堪忍受的开发者们暴怒了!国内相关开发者和律师专家团队召开苹果应用市场反垄断集体行动说明会,认为后者在长期运营中涉嫌违法.侵权并存在垄断行为

编写程序到底是什么玩意?

今天有人提问:我们学编程,到底是学什么? 我想了一会儿,回答他:"学编程,就是学着怎么制定规则!" 所以你会发现,在学编程的人中,逻辑思维能力强的人,编程一般都学得不错,而做事丢三落四的人一般都学得不好. 在网上看到一个笑话,就很好的说明了有编程思维和没有编程思维人的区别. 某日,一个大学老师提问一学生,树上有十只鸟,开枪打死一只,还剩几只? 普通人回答:还有九只.(死了一只,树上还站着九只) 脑筋能转一次弯的人回答:还有一只.(死的还在树上,另外九只吓跑了) 脑筋能转两次弯的人回答:

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);