【C++】new/delete(系统怎么知道op是指向的是一个对象还是一组对象?)

这篇博客探讨了C++中使用指针调用对象方法的细节,以及new和delete操作符在处理对象数组时的工作原理。文章指出,new运算符会为对象数组分配额外的内存来存储元素数量,并在delete[]时正确调用析构函数。错误地使用delete可能导致内存管理问题,如未正确释放内存或触发程序崩溃。重点讨论了内存越界、对象计数和正确使用delete[]的重要性。
摘要由CSDN通过智能技术生成

1.op指针调用第二个对象的Print方法
在这里插入图片描述

2.系统怎么知道op是指向的是一个对象还是一组对象?
new Object[10] 系统知道连续开辟了10个对象,开辟10个Object空间,实际上new还多开辟了4个字节的空间,在上面多开辟4个空间,先记录开辟空间的个数(10)。

delete[]op删除的时候,它告诉其删除的是一组对象(10),[]告诉其上移4个字节来读取这里面的值(10),调用10次析构函数。

如用delete op; 删除连续的多个空间,会导致错误。
此语句只删除1个对象,而且在开辟空间的时候,有上越界标记和下越界标记,还有一个头部信息(给堆区看的),new申请空间的大小存在头部信息,创建对象个数在自己创建的空间。delete op;向上读,会产生内存读的错位,导致这里的删除让程序崩溃。
在这里插入图片描述

如果只是申请单个对象:Object *op=new Object(10);
用delete[]op;,系统认为指向的这个位置点上4个字节是创建空间(对象)的个数,可是这是上越界标记,导致系统误认,导致程序崩溃,越界标记的值是FDFDFDFD(被误认为对象的个数)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值