5.10 C++内存管理操作符重载
参考:http://www.weixueyuan.net/view/6388.html
注意:
内存管理操作符new、new[]、delete和delete[]同样也可以进行操作符重载,其重载形式既可以是类成员函数的形式,又可以是顶层函数的形式
只有在需要进行自己的内存管理时才会对内存管理操作符进行重载。
在重载new和new[]操作符时,无论是以何种形式进行重载的,重载函数的第一个参数必须是size_t类型,该参数表示的含义是要分配空间的大小,对于new[]的重载函数而言,size_t类型参数则表示所需要分配的所有空间的总和。当然,重载函数也可以有其它参数,其它参数可以根据需要增加,但是第一个参数必须是size_t类型。
重载delete和delete[]操作符同样也都必须有一个参数,该参数为一个void型指针,指向需要释放的内存空间,当然重载函数同样可以根据需要添加其它参数,但是第一个指向待释放的内存空间的void型指针这个参数必不可少。
--------------------------------------------
内存管理操作符new、new[]、delete和delete[]同样也可以进行操作符重载,其重载形式既可以是类成员函数的形式,又可以是顶层函数的形式。在设计一般的程序时,使用内建的内存管理操作符基本够用了,只有在需要进行自己的内存管理时才会对内存管理操作符进行重载。
操作符new的重载函数有两种形式:
void * 类名::operator new ( size_t size )
{
//以类成员函数的形式重载new操作符
}
和
void * operator new ( size_t size )
{
//以顶层函数的形式重载new操作符
}
两种方式的重载函数返回值都是相同的,返回值都是void *类型。重载函数的参数都有一个参数,且均为size_t类型。在重载new和new[]操作符时,无论是以何种形式进行重载的,重载函数的第一个参数必须是size_t类型,该参数表示的含义是要分配空间的大小,对于new[]的重载函数而言,size_t类型参数则表示所需要分配的所有空间的总和。当然,重载函数也可以有其它参数,其它参数可以根据需要增加,但是第一个参数必须是size_t类型。如下面的重载是错误的:
void * 类名:: operator new( void * ptr) { }
同样的delete操作符也有两种重载形式:
void 类名:: operator delete ( void *ptr)
{
//以类成员函数的形式重载delete操作符
}
和
void 类名:: operator delete ( void *ptr)
{
//以类成员函数的形式重载delete操作符
}
两种重载方式均是返回void,并且两种重载方式都必须有一个参数,void 指针,该指针指向需要释放的内存空间。重载delete和delete[]操作符同样也都必须有一个参数,该参数为一个void型指针,指向需要释放的内存空间,当然重载函数同样可以根据需要添加其它参数,但是第一个指向待释放的内存空间的void型指针这个参数必不可少。
当我们以类成员函数的形式重载了new和delete操作符时,其使用方法如下:
C * c = new C; //分配内存空间
//
delete c; //释放内存空间
当然如果类中没有定义new或者delete的重载函数,则系统会自动调用内建的new或delete操作符。
5.10 C++内存管理操作符重载的更多相关文章
- 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理
[翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...
- Netty核心概念(10)之内存管理
1.前言 之前的章节已经将启动demo中能看见的内容都分析完了,Netty的一个整体样貌都在第8节线程模型最后给的图画出来了.这些内容解释了Netty为什么是一个异步事件驱动的程序,也解释了Netty ...
- C++ 操作符重载 (operator)
重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...
- MMU内存管理单元
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及 ...
- [转帖]MMU内存管理单元
MMU内存管理单元 https://www.cnblogs.com/alantu2018/p/9002309.html 之前对这一块一直不理解 最近学习了点 CPU time slice 以及 con ...
- C语言笔记 12_可变参数&内存管理&命令行参数
可变参数 有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数.C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数.下面的实例 ...
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...
- C++内存管理-重载内存管理函数
记录学习的点点滴滴,参考侯捷<<C++内存管理>> 我们先重载一下C++的几个内存管理函数 operator new, operator new[], operator del ...
- 【C++基础学习】引用和指针、重载、函数、内存管理
第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &a ...
随机推荐
- jmap -histo pid 输出的[C [B [I [S 的含义
JMAP 输出 其中: [C is a char[][S is a short[][I is a int[][B is a byte[][[I is a int[][]
- p1209 Barn Repair
用优先队列存放不连续的断点及断的位置.优先取间距大的,在断点断开. #include <iostream> #include <cstdio> #include <cma ...
- HDOJ-1806 ( Frequent values ) 线段树区间合并
http://acm.hdu.edu.cn/showproblem.php?pid=1806 线段树维护区间出现频率最高的出现次数.为了维护上者,需要维护线段前后缀的出现次数,当和其他线段在端点处的字 ...
- Bipartite Segments CodeForces - 901C (区间二分图计数)
大意: 给定无向图, 无偶环, 每次询问求[l,r]区间内, 有多少子区间是二分图. 无偶环等价于奇环仙人掌森林, 可以直接tarjan求出所有环, 然后就可以预处理出每个点为右端点时的答案. 这样的 ...
- Arthur and Brackets CodeForces - 508E (贪心,括号匹配)
大意: n个括号, 位置未知, 给出每对括号左右间距, 求输出一个合法括号序列. 最后一个括号间距一定为1, 从右往左遍历, 每次括号划分越小越好. #include <iostream> ...
- Version Control System
Version Control System(版本控制系统),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型 ...
- Leetcode 980. 不同路径 III
980. 不同路径 III 显示英文描述 我的提交返回竞赛 用户通过次数42 用户尝试次数43 通过次数46 提交次数60 题目难度Hard 在二维网格 grid 上,有 4 种类型的方格: 1 ...
- 基数排序模板[luogu 1177]
#include<bits/stdc++.h> #define LL long long using namespace std; ,bas=; ]; LL idx(LL k,LL w) ...
- FJUT16级第一周寒假作业题解G题
题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P6 涨姿势题1 TimeLimit:1000MS MemoryLimit:128000K ...
- ReactiveCocoa入门教程--第二部分
翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使 ...