C ++中的new操作运算符!

本文详细解析了C++中的new运算符与operator new的区别及联系,介绍了new运算符如何分配内存并调用构造函数,同时解释了如何手动使用operator new进行内存分配。

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

C++中new操作符和operator new 是两个不同的概念!

string *p=new string("hello c++!");(注意C++的string是封装好的类型)!

这里所使用的new操作符!别看它是英文单词!但是它和'+','-'等一样,都是C++的运算符,

一个更好的例子就是sizeof运算符!

对于new运算符总是完成两项工作:一是分配足够的内存来容纳对象,二是调用构造函数来初始化分配的内存!

上面提到的operator new 就是来完成第一步的,所以说new运算符包含operator new 的功能!

它的函数原型是:void* operator new(size_t size);返回的是一个指向刚才所分配内存的指针,就好像C语言中malloc函数,其实它的内部实现就是调用malloc函数!size 是制定要分配的内存的大小,你可以重载这个函数但是必须保证第一个参数一定是size_t类型!

我们一般情况下是不需要显示调用operator new的但是如果非要调用的话,也是可以的:

void* memory=operator new(sizeof(string));

这样operator new 返回了一个void指针指向一块足够容纳一个string对象的内存!

就和malloc一样,operator new 的唯一作用就是非配内存!

下面说说new 运算符的第二步:调用构造函数!

还是以开头的那个例子说事:

它可以分成如下几步(伪码):

void* memory=operator new(sizeof(string));

call string::string("hello c++")on memory;

string* pa=static_cast<string>(memory);

我们可以手动的去完成new运算符的第一步功能,但是第二步就不可以了,我们是不能显示的调用构造函数的!但是编译器给了我们一个折中的办法!来完成这个有时候看似必要的操作!是什么时候呢?就是有时候当我们动态的分配了一段内存后并没有初始化(调用构造函数)比如:void* memory =operator new(sizeof(string));

这段内存没有初始化,这时候我们可以调用operator new 的一个特殊版本placement new来完成接下来的工作:string *p=new(memory)string("hello c++!");

这两句话加起来就相当于new运算符做的事情了!

其实这些知识在我们平时的学习中很少用到,但是如果你了解了,它会帮助你更加深刻的理解一些知识!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值