C++ Primer 笔记——控制内存分配
1.当我们使用一条new表达式时,实际执行了三步操作。
- new表达式调用一个名为operator new ( 或者operator new[] ) 的标准库函数。该函数分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象(或对象的数组)
 - 编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
 - 对象被分配了空间并构造完成,返回一个指向该对象的指针。
 
2.当我们使用一条delete表达式删除一个动态分配的对象时,实际执行了两步操作。
- 对指针所指的对象或者数组名所指的数组中的元素执行对应的析构函数。
 - 编译器调用名为operator delete ( 或者operator delete[ ] ) 的标准库函数释放内存空间。
 
3.标准库定义了operator new函数和 operator delete函数的8个重载版本。

- 类型nothrow_t是定义在new头文件中的一个struct,在这个类型中不包含任何成员。new 头文件还定义了一个名为nothrow的const对象,可以通过这个对象请求new的非抛出版本。
 - 与析构函数类似,operator delete也不允许抛出异常,重载时也必须指定noexcept。
 - 尽管一般情况下我们可以自定义具有任何形参的operator new,但是 void *operator new(size_t,void*) 不允许被重载。
 
4.operator new和operator delete函数并没有重载new表达式和delete表达式。一条new表达式的执行过程总是先调用operator new函数以获取内存空间,然后在得到的内存空间中构造对象。一条delete表达式的执行过程总是先销毁对象,然后调用operator delete函数释放对象所占的空间。
5.与allocator不同的是,对于operator new分配的空间来说我们无法使用construct函数构造对象,相反我们应该使用new的定位new形式构造对象。该函数不分配任何内存,它只是简单地返回指针实参,然后由new表达式负责在指定的地址初始化对象以完成整个工作。事实上,定位new允许我们在一个特定的,预先分配的内存地址上构造对象。
int *p = new int;
new (p) int();
6.和调用destory类似,调用析构函数可以清楚给定的对象但是不会释放该对象在的空间,如果需要的话我们可以重新使用该空间。
C++ Primer 笔记——控制内存分配的更多相关文章
- [C++] 重载new和delete——控制内存分配
		
1.new和delete表达式的工作机理 1)new表达式实际执行了三步 string *sp=new string("aaaa"); ];//string采用默认初 ...
 - C++之控制内存分配
		
一.内存分配方式 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释 ...
 - c++控制内存分配
		
为了满足应用程序对内存分配的特殊需求,C++允许重载new运算符和delete运算符控制内存分配,通过定位new表达式初始化对象(好处是可以在某些场景下避免重新内存分配的消耗) 1.operate n ...
 - 【C++ Primer | 19】控制内存分配
		
重载new和delete 1. 测试代码: #include<iostream> #include<new> using namespace std; class A { pu ...
 - 深入理解Java虚拟机之读书笔记三 内存分配策略
		
一般的内存分配是指堆上的分配,但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配.对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下直接分 ...
 - 《深入理解Java虚拟机》学习笔记之内存分配
		
JVM在执行Java程序的过程中会把它所管理的内存划分若干个不同的数据区域,如下图: 大致可以分为两类:线程私有区域和线程共享区域. 线程私有区域 程序计数器(Program Counter Regi ...
 - C语言学习笔记--动态内存分配
		
1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...
 - C++ 内存分配操作符new和delete详解
		
重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...
 - JVM探秘:内存分配与回收策略
		
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 内存分配一般关注的是对象在堆上分配的情况,对象主要分配在新生代的Eden区中,如果启用 ...
 
随机推荐
- Web方面的错误, 异常来自hresult:0x80070057(E_INVALIDARG)
			
删除 C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET files 这个文件夹. 解决方法: 1.代码保存频繁一点.做一个 ...
 - Linxu基础知识:终端、终端模拟器、shell
			
实验楼课程第二个实验的讲解部分出现了三个词,我不知道它们三个是什么关系.查阅了度娘,归纳如下: - 终端: 在UNIX/LINUX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端就成为S ...
 - 在Vue中的load或ready的加载时机
			
在Vue中的load或ready的加载时机 1.我们来插入一段代码来分析: Js代码如下 <script type="text/javascript"> var app ...
 - 【VMware vSphere】Veeam备份
			
前言 刚刚整理自己的Onenote笔记,发现有一篇笔记没有整理到博客上面来.因为没有许可证书,所以最后也没有成功,但是还是写在这里吧,万一哪儿天有了许可证书就又可以做试验了~ Veeam Backup ...
 - 【Ubuntu】如何修改IP
			
前几天有幸捣鼓了一下Ubuntu系统,和Linux系统差不多,在这里说说如何修改IP 1,首先使用命令ifconfig查看当前IP,如图 2,编辑文件,输入命令 ...
 - 设计模式C++学习笔记之十(Builder建造者模式)
			
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...
 - 【转】Java并发编程:Thread类的使用
			
一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...
 - ranlib 作用
			
ar 命令用于更新,维护管理静态库. ranlib 命令用于 更新库的符号索引表. 当只执行了ar命令(用于更新)时, ld连接时会仍然报错,查找不到更新的变量或函数,此时需要用ranlib来更新库的 ...
 - SQL Server 2017 安装详解
			
SQL server 2017下载链接:https://pan.baidu.com/s/1FSzqJfHQAa0QpZ_fObrfjQ 提取码:1xvb 1.双击iso镜像文件 打开setup ...
 - 51nod--1298 (计算几何基础)
			
题目: 1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆 ...