首页 > 其他分享 >delete p和delete[] p的区别

delete p和delete[] p的区别

时间:2022-09-28 20:05:34浏览次数:49  
标签:cout 区别 int void operator new delete


operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:

void* operator new (size_t);        // allocate an object

void* operator new [] (size_t);     // allocate an array
void operator delete (void*);       // free an oject
void operator delete [] (void*);    // free an array


 


熟悉C的朋友看到这里可能会很奇怪:

在C中释放内存用free(void *)【注意这里只有一个参数void *】
为什么到了C++里会出现两个!按理说delete 会调用free释放内存的啊?
另外delete []是如何知道删除的对象个数的?


《高质量C++编程指南》这么说:


在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如:

delete []objects;    // 正确的用法

delete objects;      // 错误的用法

后者相当于delete objects[0],漏掉了另外99 个对象



关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 



对于 (1),下面提供的程序可以证明 delete[] 和 delete 是等同的。


#include <iostream>
using namespace std;

int main()
{
int *p = new int;
delete []p; // 和delete p等价
p = NULL;

cout << "\n===============================\n";
int *q = new int[10];
delete q; // 和delete []q等价
q = NULL;

return 0;
}


但是对于 (2),情况就发生了变化。请看下面的程序。


#include <iostream>
using namespace std;

class T
{
public:
T(){ cout << "constructor" << endl; }
~T(){ cout << "destructor" << endl; }
};

int main()
{
const int NUM = 3;
T *p = new T[NUM];

cout << hex << p << endl;
delete[] p;
//delete p; //error, debug assertion failed!

return 0;
}


从运行结果中我们可以看出,delete p在回收空间的过程中,只有 p[0] 这个对象调用了析构函数,其它对象如 p[1]、p[2] 等都没有调用自身的析构函数,这就是问题的症结所在。


如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。


基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。 但最好是:new 和 delete、new[] 和 delete[] 对应使用。

标签:cout,区别,int,void,operator,new,delete
From: https://blog.51cto.com/u_3002289/5720751

相关文章

  • 重载、隐藏和重写(有的书叫“覆盖”)的区别?
    1) 重载的特征:a)相同的范围(在同一个类中)   b)函数名字必须相同    c)参数不同(指参数类型不同,或参数个数不同,或两者皆有)     d)virtual关键字......
  • [转]逻辑回归和线性回归区别
    https://blog.csdn.net/qq_30354455/article/details/827976201)线性回归要求变量服从正态分布,logistic回归对变量分布没有要求。2)线性回归要求因变量是连续性数值变量,而lo......
  • docker 与虚拟机 区别
      虚拟机:对硬件虚拟化,不同的llinux内核。 docker:只是将容器与操作系统隔开,各个容器之间隔开  虚拟机的Hypervisor创建了一个非常牢固的边界,以防止应用程序......
  • 什么是SHA384,SHA384和SHA512有什么区别
    在密码学中,经常看到SHA384算法,SHA384是SHA中的一种算法,很多人对它并不陌生。SHA即安全散列算法,又称杂凑算法或哈希算法。SHA包含5个算法,分别是SHA-1、SHA-224、SHA-256、SHA......
  • 什么是SHA384,SHA384和SHA512有什么区别
    在密码学中,经常看到SHA384算法,SHA384是SHA中的一种算法,很多人对它并不陌生。SHA即安全散列算法,又称杂凑算法或哈希算法。SHA包含5个算法,分别是SHA-1、SHA-224、SHA-256、SH......
  • session和cookie的区别
    一·概念理解首先呢,要了解session和cookie的区别先要了解以下几个概念:1、无状态的HTTP协议:协议,是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则......
  • 【学习笔记】InnoDB 和 MYISAM 的区别
    InnoDB和MYISAM的区别InnoDB和MYISAM是数据库引擎,也就是数据库表的类型INNODB现在默认使用MYISAM早些年默认使用 INNODB和MYISAM的区别 MY......
  • 【JAVA】探讨 Java 中 valueOf 和 parseInt 的区别
    前言在编程中,遇到类型转换,好像会经常用到parseInt和valueOf,当然这里只拿Integer类型进行陈述,其他类型也是雷同的;想必有读者也跟我一样,经常交叉使用这两个方法,但却不......
  • @Autowired和@Resource到底什么区别,你明白了吗?
    大家做Java开发的,肯定对于Spring是非常熟悉的,而且面试的时候,也相信大家能够非常轻易的知道这个所有的关于Spring的面试题,比如Spring的注入什么的。也肯定会被问到@......
  • 翻了ConcurrentHashMap1.7 和1.8的源码,我总结了它们的主要区别。
    ConcurrentHashMap思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独......