C++new运算符

本文深入探讨了C++中的new运算符,包括其常见用法,如自动调用构造函数,以及new的具体实现过程,涉及到全局operator new分配空间和placement new调用构造函数。此外,文章讨论了为什么在某些情况下不应重载全局operator new,以及陈硕大佬对此的观点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new运算符虽然用的很久,但是我实际上对它的了解仅仅局限于表面知道和malloc一样可以在堆内存中申请内存,可能会调用对象的构造函数。但是具体的实现和什么时候调用构造函数完全不了解,因此今天在这里进行梳理。

1. new的常见用法

int *a =new int[5];
int *b =new A();

在实际操作中,我们发现A的申请的空间的储存的值为随机值,new仅仅申请了一块随机空间,但是B的申请的空间的值已经初始化了,new调用了A的构造函数。
new A()的功能如下

  • 在堆上申请空间
  • 在分配的空间上调用对象的构造函数(这也是new和malloc的主要区别,是否调用构造函数)
    在调用delete b时的发生的事情是
  • 调用该对象的析构函数
  • 释放该对象的内存空间

new的具体实现

new的功能可分为两部分

  • 分配空间

  • 调用构造函数
    C++规定这两个功能是由两个函数分别实现的分别是

  • 分配空间:operator new

  • 调用构造函数:调用palcement new
    所以说实际上C++的new的实现过程是关键词new调用表达式new(operator new)来分配空间,这个operator new是一个全局的函数,写在一个文件中,当使用new关键词时,编译器会找到这个函数,并且调用,new操作符的声明如下

void * operator new(std::size_t size) throw(std::bad_alloc)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值