new 操作符和 new 操作的区别

本文解析了C++中new操作符与new操作的区别。new操作符负责分配内存并调用构造函数初始化对象,而operator new函数则专注于内存分配,不涉及对象的初始化。

转自http://blog.youkuaiyun.com/linuxarmsummary/article/details/40787143

操作符(new operator) 和 new操作(operator new)的区别。
当你写这样的代码: string *ps = new string(“Memory Management”);
你使用的 new 是 new 操作符。这个操作符就象 sizeof 一样是语言内置的,你不能改变它的含义,它的功能总是一样的。它要完成的功能分成两部分。第一部分是分配足够的内存以便
容纳所需类型的对象。第二部分是它调用构造函数初始化内存中的对象。new操作符总是做这两件事情,你不能以任何方式改变它的行为。

你所能改变的是如何为对象分配内存。new 操作符调用一个函数来完成必需的内存分配,你能够重写或重载这个函数来改变它的行为。new 操作符为分配内存所调用函数的名字是 operator new

函数 operator new 通常这样声明:
void * operator new(size_t size); //参数 size_t确定分配多少内存
返回值类型是 void*,因为这个函数返回一个未经处理(raw)的指针,未初始化的内存

你一般不会直接调用 operator new,但是一旦这么做,你可以象调用其它函数一样调用它:
void *rawMemory = operator new(sizeof(string));

操作符operator new将返回一个指针, 指向一块足够容纳一个string类型对象的内存。
就象 malloc 一样,operator new 的职责只是分配内存。它对构造函数一无所知。operator new所了解的是内存分配

void *memory = // 得到未经处理的内存
operator new(sizeof(string)); // 为 String对象
call string::string(“Memory Management”) //初始化
on *memory; // 内存中 // 的对象
string *ps = // 是 ps指针指向
static_cast

### 三级标题:C++ 中 new 操作符new 操作区别与联系 在 C++ 中,`new` 是一个关键的操作符,用于动态内存分配,并支持对象的构造初始化。然而,`new` 这个操作符本身的功能可以被拆解为两个部分:**new 操作符**(new operator) **new 操作**(operator new)。 **new 操作符** 是语言内置的操作符,类似于 `sizeof`,其行为是固定的,不能被重载或修改。当使用 `new` 操作符创建对象时,例如: ```cpp string *ps = new string("Memory Management"); ``` 该语句会完成两个主要任务:首先分配足够的内存以容纳 `string` 类型的对象;其次调用 `string` 的构造函数来初始化这块内存中的对象。这种行为是统一且固定的,不能被改变[^1]。 另一方面,**new 操作**(即 `operator new`) 是负责内存分配的底层机制。它是可以被重载的函数,允许开发者自定义内存分配策略。例如,标准库提供了全局的 `operator new`,用于在堆上分配内存: ```cpp void* operator new(size_t size); ``` 当 `new` 操作符需要分配内存时,它会调用这个函数。如果内存分配失败,`operator new` 默认会抛出 `std::bad_alloc` 异常。开发者可以通过重载 `operator new` 来实现自定义的内存池或调试内存分配逻辑[^2]。 两者的联系在于,`new` 操作符在执行时,会调用 `operator new` 来完成内存分配,然后再调用构造函数初始化对象。因此,`new` 操作符可以看作是 `operator new` 构造函数调用的组合体。如果需要释放内存,则使用 `delete` 操作符,它会先调用析构函数,再调用 `operator delete` 释放内存[^3]。 此外,`new` 操作符还支持数组的分配,例如: ```cpp int* arr = new int[10]; ``` 在这种情况下,`new` 操作符会为每个数组元素调用构造函数(如果是类类型),并在释放时使用 `delete[]` 来确保每个对象的析构函数都被调用[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值