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

  c++告诉我们在回收new分配的单个对象的内存空间的时候用delete,

          回收new[ ]分配的一组对象的内存空间的时候用 delete[ ];

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Father
 5 {
 6 public:
 7     virtual ~Father()
 8     {
 9         cout << "Father's Desconstruct Called. " << endl;
10     }
11 };
12
13 class Son: public Father
14 {
15 public:
16     ~Son()
17     {
18         cout << "Son's Desconstruct Called " << endl;
19     }
20
21 };
22
23 int main()
24 {
25     Son* f = new Son[3];
26     delete  f;
27
28     return 0;
29 }[root@cp ~]# ./testtest/   test11/ test.o  [root@cp ~]# ./test.oSon's Desconstruct Called Father's Desconstruct Called. *** glibc detected *** ./test.o: munmap_chunk(): invalid pointer: 0x08e5e00c ***======= Backtrace: =========/lib/libc.so.6[0x7ace31]/usr/lib/libstdc++.so.6(_ZdlPv+0x22)[0x1b0552]./test.o[0x8048998]./test.o[0x8048830]/lib/libc.so.6(__libc_start_main+0xe6)[0x752ce6]./test.o[0x8048731]======= Memory map: ========00101000-001e2000 r-xp 00000000 08:06 531428     /usr/lib/libstdc++.so.6.0.13001e2000-001e6000 r--p 000e0000 08:06 531428     /usr/lib/libstdc++.so.6.0.13

//比较下面代码:

 

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Father
 5 {
 6 public:
 7     virtual ~Father()
 8     {
 9         cout << "Father's Desconstruct Called. " << endl;
10     }
11 };
12
13 class Son: public Father
14 {
15 public:
16     ~Son()
17     {
18         cout << "Son's Desconstruct Called " << endl;
19     }
20
21 };
22
23 int main()
24 {
25     Son* f = new Son();
26     delete [] f;
27
28     return 0;
29 }[root@cp ~]# g++ test.cpp -o test.o[root@cp ~]# ./test.o段错误 (core dumped)[root@cp ~]# 

从运行结果中分析,delete f在回收空间的过程中, (代码一中:)只有f[0]这个对象调用了析构函数,其他对象如:f[1], f[2]并没调用自身的析构函数; 这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。
   基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
    所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
~                                                                                  

 

 

 

时间: 2024-09-20 13:36:25

C++中delete 和delete[]的区别的相关文章

在sql server中truncate、delete、drop删除表的区别

问题描述 在sql server中truncate.delete.drop删除表的区别 请详细的说一下truancate和delete在删除表的时候有什么区别,除了(truncate删除表后不能回滚,delete可以回滚:truncate删除的数据不会产生日志记录,delete删除的数据会产生日志记录:truncate直接删除全部的数据,delete可以加上where条件删除部分数据:truncate效率高,delete效率低:)这些之外还有别的吗? 解决方案 truncate不需要检索数据容易

C++中delete和delete[]的区别详细介绍_C 语言

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

C++中delete和delete[]的区别_C 语言

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

《从缺陷中学习C/C++》——6.10 delete与delete[]的区别

6.10 delete与delete[]的区别 从缺陷中学习C/C++代码示例 char *buff = new char[reslen]; delete buff; 现象&结果申请的数组空间没有全部释放,造成内存泄露.用cppcheck工具执行静态代码扫描可以看到如下信息:(error) Mismatching allocation and deallocation: buf. Bug分析对于数组类型,如 string str = new string[10],用delete str和dele

实例理解SQL中truncate和delete的区别_MsSql

本文以一个简单实例为大家介绍了SQL中truncate和delete的区别,帮助大家理解,具体内容如下 ---创建表Table1 IF OBJECT_ID('Table1','U') IS NOT NULL DROP TABLE Table1 GO CREATE TABLE Table1 (ID INT NOT NULL, FOID INT NOT NULL) GO --插入测试数据 INSERT INTO Table1 VALUES(1,101),(2,102),(3,103),(4,104)

实例理解SQL中truncate和delete的区别

本文以一个简单实例为大家介绍了SQL中truncate和delete的区别,帮助大家理解,具体内容如下 ---创建表Table1 IF OBJECT_ID('Table1','U') IS NOT NULL DROP TABLE Table1 GO CREATE TABLE Table1 (ID INT NOT NULL, FOID INT NOT NULL) GO --插入测试数据 INSERT INTO Table1 VALUES(1,101),(2,102),(3,103),(4,104)

C++中delete和delete[]的区别说明_C 语言

    C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].  关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. 复制代码 代码如下: #include <iostream>;using namespace std; class T {public:  T() { cout <<

3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

 1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date definition Language) 数据库定义语言 create table;create view index sequence synonvm同义词,truncate table DCL语言 (Data control Language) 数据控制语言 commit rollback s

Delete和Truncate的区别

原文:Delete和Truncate的区别   一般对于没有用的数据,都会经行删除,而删除通常使用的是DELETE和TRUNCATE命令.对于有条件地删除,基本上就会使用DELETE,当然还是没有绝对,用TRUNCATE也可以实现,只要把[不需要]删除的数据插入新表,然后truncate源表,再把数据导回来或者直接重命名新表就可以了. 下面例子主要比较全表删除的情况下DELETE 和TRUNCATE 之间的差异:   首先,先创建测试用例:本例使用AdventureWorks数据库.先创建3个表