C++ new到底new什么
VS2010-Debug版本
1 9: int *obj = new int(6); 2 00F714CE push 4 //压栈 3 00F714D0 call operator new (0F711EAh) //调用new函数返回分配的地址addr --- 0F711EAh是指令 jmp operator new 的地址 4 00F714D5 add esp,4 //恢复栈 5 00F714D8 mov dword ptr [ebp-0F8h],eax //把返回的地址addr赋给起始地址为ebp-0F8h的内存空间 6 00F714DE cmp dword ptr [ebp-0F8h],0 //判断分配是否成功 7 00F714E5 je main+51h (0F71501h) //如果不成功跳往0x0F71501h 8 00F714E7 mov eax,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给eax 9 00F714ED mov dword ptr [eax],6 //把以起始地址为eax的内存空间(addr)置成6 10 00F714F3 mov ecx,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给ecx 11 00F714F9 mov dword ptr [ebp-100h],ecx //ecx的值(addr)赋给起始地址为ebp-100h的内存空间 12 00F714FF jmp main+5Bh (0F7150Bh) //无条件跳转到0x0F7150B 13 00F71501 mov dword ptr [ebp-100h],0 //起始地址为ebp-100h的内存空间置为0---分配失败的情况 14 00F7150B mov edx,dword ptr [ebp-100h] //起始地址为ebp-100h的内存空间(addr)赋值给edx 15 00F71511 mov dword ptr [obj],edx //把edx的内容(addr)赋值给obj为起始地址的内存空间a 16 10: delete obj; 17 00F71514 mov eax,dword ptr [obj] //把obj为起始地址的内存空间送往eax 18 00F71517 mov dword ptr [ebp-0ECh],eax //eax送往以ebp-0ECh为起始地址的内存空间 19 00F7151D mov ecx,dword ptr [ebp-0ECh] //以ebp-0ECh为起始地址的内存空间送往ecx 20 00F71523 push ecx //ecx压栈 21 00F71524 call operator delete (0F710A0h) 22 00F71529 add esp,4 23 11:int *obj2 = new int(7); 24 与分配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赋值给指针对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人