//############################################################################
// 解谜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的更多相关文章

  1. pythonchallenge 解谜 Level 0

    解谜地址: http://www.pythonchallenge.com/pc/def/0.html 这题没什么难度,意思就是得到2的38次方的值,然后,替换 http://www.pythoncha ...

  2. pythonchallenge 解谜

    所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址  http://www.pythonchallenge.com/ 接下来会写破解教程~

  3. Microsoft HoloLens 技术解谜(下)

    读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 ...

  4. 重载operator new delete函数

    可以重载global的operator new delete 函数,细节如下: MyNewDelete.h #pragma once #include <stdlib.h> #includ ...

  5. Unity2D项目-平台、解谜、战斗! 0.1 序言:团队、项目提出、初步设计、剧情大纲

    各位看官老爷们,这里是RuaiRuai工作室(以下简称RR社),一个做单机游戏的兴趣作坊. 本文跟大家聊一下社团内第一个游戏项目.算是从萌新项目组长的角度,从第一个里程碑的结点处,往前看总结一下项目之 ...

  6. 走进C++程序世界-----operator new delete 重载

     在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...

  7. pythonchallenge 解谜 Level 6

    第六关地址 http://www.pythonchallenge.com/pc/def/channel.html 和前几关一样,首先看网页源码吧.反正不看也没办法... <html>< ...

  8. noip模拟赛 解谜游戏

    题目描述LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画.幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它.老板有一个n*m的矩阵,他想找一个 ...

  9. MySQL进阶10--DML数据操纵预言: insert/delete/update --多表连接修改/.多表连接删除/多表连接查询-- truncate 和 delete的区别

    /* DML -- 数据操纵预言: insert/delete/update */ #一: 插入语句 /* 语法1: insert into 表名(列名,..,列名....) values(值1,值2 ...

随机推荐

  1. react状态提升问题::::

    父组件传值给子组件,只需要在组件上写上naverightstates={this.state.naverightstates},然后在子组件里面引用this.props.naverightstates ...

  2. ccf-170902-公共钥匙盒(模拟)

    这是一道典型的模拟题 首先我们把借钥匙和还钥匙切分成两个事件 保存于两个数组中 然后我对还钥匙的活动按照时间发生次序和还得钥匙序号排序,即按照题意对事件发生的次序排序 最后按照时间的进行 一个一个进行 ...

  3. NYOJ 85:有趣的数(打表,规律)

    85-有趣的数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:12 难度:2 题目描述: 把分数按下面的办法排成一个数表. 1/1 1/2 1/3 1/4- 2/1 2 ...

  4. C# 敏捷1

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  5. hdu2174 kiki's game 博弈

    Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes th ...

  6. day11hadoop高可用和Hive

    PS:视频一直就是在演示   高可用(比较偏运维一点) PS:Active是对外提供服务的,standBy是从属备用的:但是他们是怎样保证同步的数据的呢?一个运行中zookeeper上的第三方那个工具 ...

  7. 开发工具idea背景及字体设置

    背景设置: 按两下shift,在搜索框里输入set Background Image,选择set Background Image,如图所示: 设置图片的路径和透明度,如图所示: ★ 注意:idea ...

  8. MySQL Export--导出数据

    =========================================================== SELECT INTO OUTFILE语法格式: SELECT [columns ...

  9. C# 获取机器码

    using System.Runtime.InteropServices; using System.Management; using System; public class HardwareIn ...

  10. 设置 IntelliJ IDEA 的彩色代码主题

    首先,给出一系列 IntelliJ IDEA 代码的彩色主题,供大家选择: VibrantUnknown(Darcula) FadeComments NicePython Solarized Have ...