C++进阶--解谜operator new/delete
//############################################################################
// 解谜operator new/delete
/* 执行下面代码会发生什么?
*/
dog* pd = new dog();
/*
* Step 1. 调用operator new分配内存
* Step 2. 调用构造函数构造dog
* Step 3. 如果第2部抛异常,调用operator delete释放第1步分配的内存
*/
delete pd;
/*
* Step 1. 调用dog的析构函数
* Step 2. 调用operator delete释放内存
*/
/*
* 自己实现operator new:
*
* 注意: new handler是当operator new分配内存失败时调用的函数
* set_new_handler()函数设置一个新的new handler并且返回当前的new handler
*/
void* operator new(std::size_t size) throw(std::bad_alloc) {
while (true) {
void* pMem = malloc(size); // 分配内存
if (pMem)
return pMem; // 成功则返回指针
std::new_handler Handler = std::set_new_handler(0); // 获取当前的new handler
std::set_new_handler(Handler); //写回
if (Handler)
(*Handler)(); // 调用new handler
else
throw bad_alloc(); // 如果new handler为空, 抛异常
}
}
/*
* 成员函数中的Operator new
*/
class dog {
...
public:
static void* operator new(std::size_t size) throw(std::bad_alloc)
{
// if (size == sizeof(dog))
customNewForDog(size);
// else
// ::operator new(size);
}
...
};
class yellowdog : public dog {
int age;
static void* operator new(std::size_t size) throw(std::bad_alloc)
};
int main() {
yellowdog* py= new yellowdog(); //调用了dog的operator new
}
/*
* 解决方法 1:
* if (size == sizeof(dog)) //加判断
* customNewForDog();
* else
* return ::operator new(size);
*
* 解决方法 2:
* yellowdog也重载operator new
*/
/* operator delete也是类似 */
class dog {
static void operator delete(void* pMemory) throw() { //
cout << "Bo is deleting a dog, \n";
customDeleteForDog();
free(pMemory);
}
// virtual ~dog() {};
};
class yellowdog : public dog {
static void operator delete(void* pMemory) throw() {
cout << "Bo is deleting a yellowdog, \n";
customDeleteForYellowDog();
free(pMemory);
}
};
int main() {
dog* pd = new yellowdog();
delete pd; //调用了dog的operator delete
}
// 如何解决?
// operator delete定义成虚函数?
// 不行!不能既是静态函数(对象无关)又是虚函数(对象相关)
//
//
// 解决方法:
// virtual ~dog() {}
// 为什么加个虚析构函数就ok?
// 先调析构(多态),再释放内存
/*
* 为什么要自定义new/delete
*
* 1. 使用错误检测:
* - 内存泄漏检测/垃圾回收.
* - 数组的索引超出范围,在内存的首尾做签名,就可以检测数组越界
* 2. 提升效率:
* a. 将相关对象聚类,减少页错误(不命中)
* b. 固定大小分配(适合很多小对象的应用)
* c. 将相似尺寸的对象排到同一位置以减小碎片
* 3. 执行额外的任务:
* a. 将去分配的内存清0--安全性.
* b. 收集使用统计
*/
/*
* 写一个好的内存管理器很难!
*
* 在写自己版本的之前, 考虑:
*
* 1. 根据你的需要调教下你的编译器;
* 2. 搜索内存管理库, 例如boost中的pool库
*/
C++进阶--解谜operator new/delete的更多相关文章
- pythonchallenge 解谜 Level 0
解谜地址: http://www.pythonchallenge.com/pc/def/0.html 这题没什么难度,意思就是得到2的38次方的值,然后,替换 http://www.pythoncha ...
- pythonchallenge 解谜
所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址 http://www.pythonchallenge.com/ 接下来会写破解教程~
- Microsoft HoloLens 技术解谜(下)
读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 ...
- 重载operator new delete函数
可以重载global的operator new delete 函数,细节如下: MyNewDelete.h #pragma once #include <stdlib.h> #includ ...
- Unity2D项目-平台、解谜、战斗! 0.1 序言:团队、项目提出、初步设计、剧情大纲
各位看官老爷们,这里是RuaiRuai工作室(以下简称RR社),一个做单机游戏的兴趣作坊. 本文跟大家聊一下社团内第一个游戏项目.算是从萌新项目组长的角度,从第一个里程碑的结点处,往前看总结一下项目之 ...
- 走进C++程序世界-----operator new delete 重载
在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...
- pythonchallenge 解谜 Level 6
第六关地址 http://www.pythonchallenge.com/pc/def/channel.html 和前几关一样,首先看网页源码吧.反正不看也没办法... <html>< ...
- noip模拟赛 解谜游戏
题目描述LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画.幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它.老板有一个n*m的矩阵,他想找一个 ...
- MySQL进阶10--DML数据操纵预言: insert/delete/update --多表连接修改/.多表连接删除/多表连接查询-- truncate 和 delete的区别
/* DML -- 数据操纵预言: insert/delete/update */ #一: 插入语句 /* 语法1: insert into 表名(列名,..,列名....) values(值1,值2 ...
随机推荐
- [LeetCode&Python] Problem 551. Student Attendance Record I
You are given a string representing an attendance record for a student. The record only contains the ...
- 2018.4.23 git常用操作命令收集(转)
Git常用操作命令收集: 1. 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v ...
- C++学习(十二)(C语言部分)之 循环
上期回顾:分支if else switch 三目运算符 格式:if(条件){语句1:}else{语句2:} switch (变量){default:break;case 常量1:语句1 ;break; ...
- [洛谷P1417 烹调方案]贪心+dp
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3211Dream City Time Limit: 1 Second ...
- 高斯消元 o(n^3) 取摸和不取摸
#include<bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool ...
- vue的指令绑定、事件、冒泡
a标签的属性绑定: v-once:就是第一次渲染什么就是什么,不会随着其他改变而改变,简言之就是绑定他不让他的值改变 防止跨站脚本攻击 如果你觉得安全的话,可以不要让变量的值显示成字符串 解决方法是: ...
- MySQL数据库-表内容操作
1.表内容增加 insert into 表 (列名,列名...) values (值,值,值...); 添加表内容添加一条数据 insert into 表 (列名,列名...) values (值,值 ...
- java构造代码块详解
一.简介 首先说一下,Java中有哪些代码块. 普通代码块 就是在方法后面使用"{}"括起来的代码片段,不能单独执行,必须调下其方法名才可以执行. 静态代码块 在类中使用stati ...
- Go Example--错误处理
package main import ( "errors" "fmt" ) //定义一种错误类型 type argError struct { arg int ...
- Xenserver之HA实现-NFS的实现
环境: 在vm上安装好一台Xenserver服务器,一台centos7虚拟机(用来做NFS存储,因为实现HA需要共享存储),网络连接方式为桥接模式 echo '- - -'>> /sys/ ...