C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配相关的知识,希望对你有一定的参考价值。

void operator new (size_t, void ) ;//不允许重新定义这个版本

1. new

string *sp = new string("a value"); //分配并初始化一个string对象
string *arr = new string[10];   // 分配10个默认初始化的string对象

1.1 工作原理

执行了三步操作:

step1. new表达式调用一个名为operator new(或operator new [])的标准库函数,它分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或对象的数组)。

step2. 编译器运行相应的构造函数以构造这些对象,并为其传入初始值。

step3. 对象被分配了空间并构造完成,返回一个指向该对象的指针。

2. delete工作机理

delete sp;  // 销毁*sp,然后释放sp指向的内存空间
delete [] arr;  // 销毁数组中的元素,然后释放对应的内存空间

3. operator new 接口和 operator delete 接口

标准库定义了 operator new 函数和 operator delete 函数的 8 个重载版本。 前 4 个版本可能抛出 bad_alloc 异常, 后 4 个版本则不会抛出异常:

// 这些版本可能抛出异常
void *operator new (size_t) ;
void *operator new [ ] ( size_t) ;
void *operator delete (void* ) noexcept;
void *operator delete [ ] (void* ) noexcept;
 
// 分配一个对象
// 分配一个数组
// 释放一个对象
// 释放一个数组
// 这些版本承诺不会抛出异常, 参见 12.1.2 节( 第 409 页 )
void *operator new (size_t, nothrow一t & ) noexcept;
void *operator new [ ] (size一t, nothrow_t& ) noexcept;
void *operator delete (void*, nothrow_t & ) noexcept;
void *operator delete [ ] (void*, nothrow_t & ) noexcept;

4. 成员函数

应用程序可以在全局作用域中定义operator new函数和operator delete函数,也可以把它们定义为成员函数。

当编译器发现一条new表达式或者delete表达式后,将在程序中查找可供调用的operator函数:

判断被分配(释放)的对象类型是否是类


  • 编译器首先在类及其基类的作用域中查找。
  • 不是
    在全局作用域中查找,如果找到了用户自定义的版本,则使用该版本执行new或者delete表达式
    没找到的话,则使用标准库定义的版本 (//todo )

可以使用作用域运算符使得new表达式或delete表达式忽略定义在类中的函数,直接执行全局作用域的版本。比如::new和::delete

operator new 用在对象构造之前而 operator delete 用在对象销毁之后, 所以这两个成员( new 和 delete ) 必须是静态的, 而且它们不能操纵类的任何数据成员

以上是关于C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针