new\new[]\delete\delete[]区别

一般来说用new []创建的对象要用delete[]销毁(基本类型new[]创建的对象也可以用delete销毁),对于new和delete在实现上还是调用的malloc和free。

对于基本类型在销毁的时候字需要释放malloc申请的空间就可以了;

但是对于类类型销毁的时候除了需要释放malloc申请的空间之外,还需要调用对象的析构函数

在对象中可能有指针成员指向一个动态申请的内存空间,上面提到的释放申请的空间的时候只是释放了这个指针占用的空间,对于指针指向的空间,需要在析构函数中释放。

对于基本类型和类类型的new[]和delete[]在实现上稍有差别:

1. 对于基本类型new[]直接调用malloc,delete[]直接调用free,所以delete和delete[]是没有区别的。

2. 对于类类型,new[]除了调用malloc申请空间之外,还会调用构造函数对每一个对象初始化;

更重要的是,对象数组的起始地址不是malloc放回的地址p,而是p后面的四个字节处。

那么p开始的四个字节用来做什么呢?

在这四个字节的地方保存了数组中对象的个数

但是为什么要保存对象的个数呢?

原因就是对象的析构。当用malloc申请内存的时候,系统按照某个大小的块规格分配,那么就可能造成实际分配的空间比我们申请的空间要大。在系统中记录着实际分配的空间大小,当释放这个空间的时候只需要提供这个空间的起始地址,系统就可以正确释放这个空间。

对于基本类型释放实际申请的空间就可以了,但是对于类类型,前面说过了还需要调用析构函数,但是有多少个对象需要调用析构函数呢?系统不能用分配的内存数/对象大小吗?

当然不行,前面说过了,系统记录的是实际分配的空间大小,后面包括了一些我们没有用到的空间。所以一定要记录对象的数目。

3. 当类类型调用delete[]的时候,首先从数组起始位置arr的前四个字节取出对象的个数n;

然后依次调用arr,arr+sizeof(object), .......,arr+sizeof(object)*(n-1)位置对象的析构函数;

最后系统通过 (int *)arr - 1地址释放当时malloc申请的实际内存。

时间: 2024-12-06 20:08:54

new\new[]\delete\delete[]区别的相关文章

drop、truncate和delete的区别

drop.truncate和delete的区别 SQL DELETE 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作 2.delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录 3.delete语句不影响表所占用的extent,高水线(h

delete和delete[]的区别(转载)

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. #include <iostream>; using namespa

C++中delete和delete[]的区别

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. 1 #include <iostream>; 2 using name

【转】 C++中delete和delete[]的区别

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. #include <iostream>; using namespa

C/C++语言的标准库函数malloc/free与运算符new/delete的区别

概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求.对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数.而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符

C++中delete和delete[]的区别(转)

原文链接:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html 一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据

drop,delete,truncate区别

drop,delete,truncate区别 drop-->删除少量信息   eg:drop table 表名: delete-->删除某些数据   eg:delete from 表名: truncate-->删除整个表的数据/大量数据  eg:truncate table 表名:

百度笔试题:malloc/free与new/delete的区别(转)

百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和delete是C++的运算符.对于非内部数据类的对象而言,光用malloc/free 无法满足动态对象的要求.对象在创建时要自动执行构造函数,对象消亡之前要自动执行析构函数,malloc和free是库函数而不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/f

mysql中 drop、truncate和delete的区别

mysql中drop.truncate和delete的区别 (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作. TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的.并且在删除的过程中不会激活与表有关的删除触发器.执行速度快. (2)表和索引所占空间. 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小, DELETE操作不会减少表或索引

MySQL笔记-turncat、drop、delete的区别

TRUNCATE 语法: TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]功能: 删除整个表的数据并释放空间 描述: 由于Truncate 是DDL 命令,所以执行过程中原数据不放在Rollback Segment 中,不产生回滚数据 ,不产生Redo Log . Truncate , Drop 等DDL命令都是隐含提交的. 需要drop的操作权限 相当于这样的流程:先drop table 然后 create table. 不记录日志