浅析C++ new的三种面貌 C++ 中的 new 运算符是一种关键字,用于在堆上创建对象。然而,许多人对 new 的理解仅止于其基本用法,殊不知 new 还有三种不同的面貌:new operator、operator new() 和 placement new()。本文将深入探讨 C++ 中 new 的三个面貌,帮助大家更好地理解和学习 C++。 1. new operator new operator 是 C++ 的保留关键字,我们无法改变其含义,但我们可以改变 new 完成它功能时调用的两个函数,operator new() 和 placement new()。使用 new operator 时,其完成的工作有三步: * 申请原始空间,行为类似于 malloc * 通过 placement new 调用类的构造函数,初始化申请空间 * 返回对象指针 例如,在使用 new operator 创建堆对象时,我们会使用以下代码: string* sp = new string("hello world"); 实际上,编译器会将其转换为以下三步: void* raw = operator new(strlen("hello world")); new (raw) string("hello world"); string* sp = static_cast<string*>(raw); 2. operator new() operator new() 用于申请 Heap 空间,功能类似于 C 语言的库函数 malloc(),尝试从堆上获取一段内存空间。如果成功则直接返回,如果失败则转而去调用一个 new handler,然后抛出一个 bad_alloc 异常。operator new() 的函数原型一般为: void* operator new (std::size_t size) throw (std::bad_alloc); 具体实现如下: void* __CRTDECL operator new(size_t size) throw (std::bad_alloc){ // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) { if (_callnewh(size) == 0) { // report no memory static const std::bad_alloc nomem; _RAISE(nomem); } } return (p); } 需要注意的是,operator new() 分为全局和类成员函数。当为类成员函数时,使用 new 产生类对象时调用的则是其成员函数 operator new()。如果要重载全局的 operator new,会改变所有默认的 operator new 的方式,所以必须要注意。 3. placement new() placement new() 是一个特殊的 operator new(),因为其是 operator new() 函数的重载版本,只是取了个别名叫作 placement new。作用是在已经获得的堆空间上调用类构造函数来初始化对象,也就是定位构造对象。placement new() 是 C++ 标准库的一部分,被申明在头文件 <new> 中,其函数原型是: void* operator new(std::size_t, void* __p); 具体实现如下: void* operator new(std::size_t, void* __p) { return __p; } placement new() 的作用是在已经获得的堆空间上调用类构造函数来初始化对象。这在某些特殊情况下非常有用,如在已经分配的内存上创建对象。 C++ 中的 new 运算符有三种不同的面貌:new operator、operator new() 和 placement new()。每种面貌都有其特点和用途,了解它们可以帮助我们更好地理解和使用 C++。
- 粉丝: 10
- 资源: 951
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助