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库
 */

原文地址:https://www.cnblogs.com/logchen/p/10182396.html

时间: 2024-11-05 18:41:34

C++进阶--解谜operator new/delete的相关文章

【整理】一个真实的图灵:如迷的解谜者,并非万事成谜

据说,每一个码农都愿意为他默默撅起臀部,所以后来程序员都自称为IT基佬.阅读了<图灵传>,观看了<模仿游戏>电影,不免对图灵的一生有了一个了解,一个真实的图灵是怎么样子的呢?我整理了一些网上的资料并总结了一下,并非我个人原创,现在就和各位园友share一下: 1.关于电影<模仿游戏> 电影<模仿游戏>引进的有点“晚”了.这部电影在2014年获得了奥斯卡奖中的最佳改编剧本奖,可直到2015年夏天才正式引进到国内.这么一部数学家艾伦·图灵的传记片,铁杆影迷恐怕已

Broken Sword II The Smoking Mirror v2.0.09 Android-DeBTPDA 美式冒险解谜大作

Broken Sword II The Smoking Mirror v2.0.09 Android-DeBTPDA 美式冒险解谜大作         Broken Sword II The Smoking Mirror非常经典的一款美式冒险解谜大作.游戏精美的画面和细节上的精雕细琢,给人非常华丽的感觉:引人入胜的故事情节.交互式的游戏环境.全程语音给玩家的代入感强烈.在操作上采用游标指引角色行动,解谜为主,考验玩家的观察力和想象力,全部是图形显示,不识英文也能轻松上手,推荐给喜爱动脑解谜的游戏

Microsoft HoloLens 技术解谜(下)

读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的.说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩. TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One,有点混乱是吧? 双目摄像头,代表产品是 G

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

在C++ 的世界里,new 和delete 是关键字,而在C的世界里相对应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节,这里就不在过多的介绍了.链接. 下面来研究下关于new 和delete的重载. 1.对比使用重载和未使用重载 未使用" /*File : operator_new.cpp *Auth : sjin *Date : 2014-04-27 *Mail : [email protected] */ #include <iostream&g

2018-06-26 解谜计算机科学第一章示例汉化尝试

知乎原链 示例程序来源: 解谜计算机科学(1) 比如我们想要表达一个"风扇控制器",有了它之后,风扇的转速总是当前气温的两倍.这个"当前气温"就是一个未知数. 原例程: t -> t*2 f = t -> t*2 f(t) = t*2 个人觉得相对抽象, 和数学表达比较近. 猜想选择t作变量名是因为temperature. 汉化尝试如下: 气温 -> 气温*2 风扇转速 = 气温 -> 气温*2 风扇转速(气温) = 气温*2 比如,如果我想

重载operator new delete函数

可以重载global的operator new delete 函数,细节如下: MyNewDelete.h 1 #pragma once 2 #include <stdlib.h> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 class Foo 8 { 9 public: 10 int id; 11 string str; 12 13 Foo() : id(0) { cout

pythonchallenge 解谜 Level 6

第六关地址 http://www.pythonchallenge.com/pc/def/channel.html 和前几关一样,首先看网页源码吧.反正不看也没办法... 1 <html><!-- <-- zip --><head> 2 <title>now there are pairs</title> 3 <link rel="stylesheet" type="text/css" href=

微软HoloLens技术解谜

HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的图像与真实的世界相叠加.类似的产品有图像投射到视网膜上的 Google Glass,以及叠加在手机摄像头画面上的手机 AR 应用. 它拥有是独立的计算单元,自带 CPU + GPU +HPU,不需要外接计算机.它的 CPU 和 GPU 基于英特尔的 14纳米工艺的 Cherry Trail 芯片,H

python 解谜 Level 1

得到第一关地址后可以进行第一关的解析了. 看起来好神秘的样子.但是也就是把字母 k 变成 m , o 变成 q ,e 变成 g.将字母对应的ASCII的值+2就行了. 1 #-*- coding:utf-8 -*- 2 #代码版本均为python 3.5.1 3 #Level 1 4 str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgag