//############################################################################
// 解谜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. textarea(多行文本域)

    多行文本域<textarea>: <textarea name="..." rows="..." cols="..." . ...

  2. 1100C NN and the Optical Illusion

    推公式,水题.cos()函数是默认弧度制的 #include <iostream> #include <cstring> #include <string> #in ...

  3. 给电脑换源 npm 国内镜像 cnpm

    (1)通过 config 配置指向国内镜像源 npm config set registry http://registry.cnpmjs.org //配置指向源 npm info express   ...

  4. PTA——猜数字游戏

    PTA 7-24 猜数字游戏 #include <stdio.h> int main() { int num, times; scanf("%d %d", &n ...

  5. java-代码块-局部代码块、构造代码块、静态代码块

    1.代码块概述: 在Java中,使用{ }括起来的代码被称为代码块. 2.代码块分类: 根据其位置和声明的不同,可以分为局部代码块,构造代码块.静态代码块和同步代码块(多线程). 3.常见代码块的应用 ...

  6. ubuntu设置静态ip后不能上网

    加上下面的配置,然后重启 sudo vim /etc/resolvconf/resolv.conf.d/base nameserver 223.5.5.5nameserver 8.8.8.8names ...

  7. 如何对oracle数据库进行监控检查

    sqlplus '/as sysdba' 手动生成一个oracle数据库的快照 execute dbbms_workload_repository.create_snapshot(); 执行自动工作负 ...

  8. sofa graphql 2 rest api 试用

      大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...

  9. .NET本质论 实例

    对象和值的比较 CLR的类型系统(其实就是通用类型系统(CTS),它定义了如何在运行库中声明,使用和管理类型,同时也是运行库支持跨语言集成的一个重要组成部分)将对应简单值的类型同对应传统"对 ...

  10. 笔记:Javascript 会提升变量声明

    笔记:Javascript 会提升变量声明 Javascript 会自动提升变量声明,但不会提升变量赋值. 如下代码, 按 F12 控制器显示的是 Hello, undefined 说明只是把 b 了 ...