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)详解 (有些和我尝试的不一样,第四节可以着重参考)
转载于:https://www.cnblogs.com/Jacket-K/p/9337131.html
operator new和operator delete相关推荐
- 类的operator new与operator delete的重载
为什么有必要写自己的operator new和operator delete? 答案通常是:为了效率. 缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块.同样 ...
- Cpp 对象模型探索 / operator new、operator delete、operator new[] 和 operator delete [] 重载
零.前言 对于函数 operator new 和 operator delete 来说,分为全局重载和局部重载. 全局重载的形式: void *::operator new(size_t size); ...
- 实现自己的operator new和operator delete以及实现一个简单的内存池管理类
为什么有必要写自己的operator new和operator delete? 为了效率.缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特 ...
- operator framework搭建operator开发环境
简介 operator framework 是一个为云原生开发者提供开发operator的组件框架的开源项目,它目前包含三个组件: Operator SDK.集成controller-runtime, ...
- 【C++】operator bool() 和 operator const bool() const
1.问题描述 在走读QtCreator源码时,看到如下运算符重载 源码在QtCreator-v4.9.2中 src\plugins\projectexplorer\projectexplorer.h ...
- C++ 动态内存管理:c/c++的动态内存管理,new/delete,operator new/delete,placement-new, 内存泄漏
c/c++的动态内存管理 new/delete opeartor new/delete placement-new 内存泄漏 c/c++的动态内存管理 在开始之前首先要了解c和c++的内存分布,我简单 ...
- 通过从全局和类内部重载operator new /delete来获取内存管理权
目录 1.通过重载获得内存管理权 2.容器的内存管理 3.重载new.array new.replacement new,接管内存控制权 1.重载全局::operator new / ::operat ...
- C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...
- EC笔记:第二部分:11:在operator=中处理“自我赋值”
已经一年半没有写过博客了,最近发现学过的知识还是需要整理一下,为知笔记,要开始收费了以前写在为知笔记上笔记也会慢慢的转到博客里. 话不多说,进入正题. 考虑考虑以下场景: 当某个对象对自身赋值时,会出 ...
最新文章
- Google 全球员工围攻 Google!
- JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
- 【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真
- react让我怀疑自己没有当程序员的天分怎么破?
- python app mysql_Python 操作 MySQL 的5种方式
- linux amd64 界面,linux脚本编程---ubuntu-12.04-server-amd64如何配置图形界面
- 上海的雨什么时候才可以停...
- 【python】Django设置SESSION超时时间没有生效?
- CSS:标签右对齐,文本框左对齐的实现
- Windows 关于Robocopy的使用详解
- 智能性与实用性兼具,华为开启智能眼镜全民时代
- linux mysql免安装版配置_Linux下MySQL免安装版安装配置记录
- 最近大火的chatGPT是什么?它是怎样聊天的?
- Linux部署docker容器(使用root用户登录)
- 电机的matlab仿真实例,电机控制Matlab仿真模型
- 细数20世纪最伟大的10大算法
- 基于eBox旋转编码器
- 从黑客文化看区块链开源社区的自我组织与成功之道
- 一人点赞,N人跟风?
- 新东方老罗(罗永浩)语录全集
热门文章
- node爬取app数据_在电销行业中,运营商大数据究竟起着怎样的作用
- form表单中,file选择图片后预览
- Eclipse中svn插件:Subclipse插件安装
- uniapp H5页面使用uni.request时,出现跨域问题
- Appium 与 Chromedriver
- c语言 元组顺序随机化,为什么关系中的元组没有先后顺序且不允许有重复元组?...
- 对PASCAL VOC 数据集进行数据增强
- Redirecting to binsystemctl start crond.service
- amd cpu 不兼容centos5.5_AMD放弃兼容性?这事简单也不简单
- mysql 线程_MySQL服务器线程数的查看方法详解