发布网友 发布时间:2022-04-21 07:55
共2个回答
热心网友 时间:2023-07-05 01:20
delete []操作符实际有两个作用,1对于一个数组若干相同类的对象,会调用每个对象的析构函数,2然后回收这个数组的内存。
对于简单类型数据的数组,例如int[],char []来说,是不需要对数组的每一个对象调用析构函数的,对于这些简单类型,只需要回收内存即可。
回收内存的大小是多少?这个问题对于不同内存分配器的实现来说,有不同的做法,一个非常可能的做法就是保存在new返回指针之前的内存位置,也就是p[-1]的位置。
case 1,没问题,指针对了,就能delete
case 2,有问题,p[10]前一个是p[9],并不是new数组时候记录的分配大小信息,按照p[9]位置储存的信息来delete,出错。
case 3,没问题,指针值对了就行。
一个非常简化的operator new实现
T *new (int size)
T *pt = (T*)malloc(size + sizeof(int));
*((int*)pt) = size;
return (T*)((char *)pt + sizeof(int));
这样返回给你的指针,比它malloc得来的,向后一个int,这里保存了给你分配内存的大小。
对于对象数组,使用delete[]和delete是不同的,如果传来的是数组而调用了delete,则只会调用第一个对象的析构函数,其余n-1个对象的析构没有调用。
在释放内存的作用上,两个操作符没有差别,也就是说对象数组只有第一个元素被析构,其余的没有析构,其余对象所分配的内存,没有机会在析构函数里释放,造成了内存泄漏。
对于简单类型的数组,没有区别,因为没有析构函数。
热心网友 时间:2023-07-05 01:21
new申请的内存实际大小不是20个字节,这块内存的user memory block之前会分配一部分内存记录着分配这块内存的信息,其中包括这块内存的申请长度,如果,改变指针的的值,那么,使用delete释放内存的时候,可能出现非法操作内存。delete释放的内存其实,并没有真正的释放,而是将这些内存从新加入到动态内存空闲链表。