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