operator new和operator delete
从STL源码剖析中看到了operator new的使用
template<class T>
inline void _deallocate(T* buffer) {
::operator delete(buffer);
//operator delete可以被重载
// operator delete(buffer);
}
从而开始研究一下这两个操作符
首先其实迷惑的是"::"的作用,通过以下代码测试出来了
class A {
public:
void TT() {
cout << "A" << endl;
}
};
inline void TT() {
cout<<"G"<<endl;
}
class B: public A {
public:
void TT() {
cout << "B" << endl;
::TT();
}
};
int main(int argc, char **argv) {
// new Allocator();
(new B())->TT();
return 0;
}
运行结果
B
G
用于区分全局函数和函数内局部函数的符号。
#include <iostream>
#include <vector>
#include "2jjalloca.h"
#include <new> using namespace std; //inline void *operator new(size_t n) {
// cout << "global new" << endl;
// return ::operator new(n);
//}
//
//inline void *operator new(size_t n, const std::nothrow_t& nt) {
// cout << "global new nothrow" << endl;
// return ::operator new(n, nt);
//} class Allocator {
public:
void *operator new(size_t n) {
cout << "allocator new" << endl;
return ::operator new(n);
}
//作用域覆盖原则,即在里向外寻找operator new的重载时,
//只要找到operator new()函数就不再向外查找,如果参数符合则通过,
//如果参数不符合则报错,而不管全局是否还有相匹配的函数原型。
//所以的调用new(std::nothrow) Allocator;注释这个函数是报错
void* operator new(size_t n, const std::nothrow_t& nt) {
cout << "allocator new nothrow" << endl;
return ::operator new(n, nt);
} void* operator new(size_t n, void *p) {
cout << "allocator placement new" << endl;
return p;
} void operator delete(void *p) {
cout << "allocator delete" << endl;
return ::operator delete(p);
}
void operator delete(void*, void*) {
cout << "allocator placement delete" << endl;
} void* operator new[](size_t n) {
cout << "allocator new[]" << endl;
return ::operator new[](n);
}
}; int main(int argc, char **argv) {
// Allocator *a = new Allocator;
// delete a;
// ::new Allcator; Allocator *a=new Allocator[10];
return 0;
}
参考文章
C++ 内存分配(new,operator new)详解 (有些和我尝试的不一样,第四节可以着重参考)
operator new和operator delete的更多相关文章
- Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new
条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2 ...
- 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...
- 定制自己的new和delete:operator new 和 operator delete
new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- operator new 和 operator delete 实现一个简单内存泄漏跟踪器
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...
- 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- ZT 自定义operator new与operator delete的使用(1)
http://blog.csdn.net/waken_ma/article/details/4004972 先转两篇文章: 拨开自定义operator new与operator delete的迷雾 C ...
- 类的operator new与operator delete的重载【转】
http://www.cnblogs.com/luxiaoxun/archive/2012/08/11/2633423.html 为什么有必要写自己的operator new和operator del ...
- 条款八: 写operator new和operator delete时要遵循常规
自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是:要有正确的返回值:可用内存不够时要调用 ...
随机推荐
- k8s容器的资源限制
1.k8s支持内存和cpu的限制 requests:容器运行需求,最低保障limits:限制,硬限制(资源上限) CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU) 1物理核=1000个微核(mi ...
- varnish4 配置文件整理
vim default.vcl # 使用varnish版本4的格式. vcl 4.0; # 加载后端轮询模块 import directors; #######################健康检查 ...
- QTP 自动货测试桌面程序-笔记(添加控件仓库并关联到action)
录制或编写脚本前先添加行为对应的控件仓库: 心得:多个测试action使用的同一个窗体的仓库单独放于一个仓库中,可以在多个action中添加关联使用 将同一个窗体的控件只放于一个仓库中,减少使用时的名 ...
- Python——Label控件说明
Anchor : 标签中文本的位置: background(bg)foreground(fg) :背景色:前景色: borderwidth(bd) :边框宽度: width .height ...
- How to sign app
codesign --display --verbose=4 /applications/qq.app codesign --display --entitlements - /application ...
- Windows & RabbitMQ:集群(clustering) & 高可用(HA)
描述:我们需要配置三台服务器:ServerA, ServerB, ServerC 注意事项: 所有的服务器的Erlang版本,RabbitMQ版本必须一样 服务器名大小写敏感 Step 1:安装Rab ...
- #186 path(容斥原理+状压dp+NTT)
首先只有一份图时显然可以状压dp,即f[S][i]表示S子集的哈密顿路以i为终点的方案数,枚举下个点转移. 考虑容斥,我们枚举至少有多少条原图中存在的边(即不合法边)被选进了哈密顿路,统计出这个情况下 ...
- Android Spinner 绑定键值对
这里给大家提供下绑定 spinner键值对的方法. 首先创建绑定模型BaseItem public class BaseItem { public BaseItem(Integer id,String ...
- 【Loj117】有源汇上下界最小流(网络流)
[Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...
- 【BZOJ5321】[JXOI2017]加法(贪心)
[BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...