//############################################################################
// 解谜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. 论Injection的前世今生

    Click me~ why Java EE provides injection mechanisms that enable your objects to obtain references to ...

  2. 数据结构HUFFman求权值

    #include <bits/stdc++.h>using namespace std;priority_queue< int, vector <int>, greate ...

  3. php-fpm的pool池子、php慢日志记录、open_basedir、php-fpm进程管理

    1.php-fpm的poo池子:目的:可以让不同的网站,对于不同的php解析,可以把不同的网站解析区分开.编辑:vim /usr/local/php5-fpm/etc/php-fpm.conf加入: ...

  4. set_union和set_intersection

    set_union使用方法: set_union(集合A起始地址,集合A终止地址,集合B起始地址,集合B终止地址,插入C集合中(操作:inserter(C.C.begin()))); set_inte ...

  5. (23)ajax实现上传文件的功能

    form表单上传文件 urls.py from django.conf.urls import urlfrom django.contrib import adminfrom app01 import ...

  6. GinKgoCTF-Misc

    一:谁动了我的校徽? Jpg改txt——>寻找——>GKCTF{This_is_a_huaji} 二:奇怪的压缩包1 六位数字的密码一点也不安全!!!!!! 下载压缩包——>有密码( ...

  7. spring模拟ioc

    非spring 开发 public class UserService { private UserDao userDao=new UserDaoImpl(); public void addUser ...

  8. 后端程序猿怎能不会的linux命令

    (图片超清,可放大网页查看) 来源 https://zhuanlan.zhihu.com/p/28674639

  9. ES5新增数组方法

    forEach/map   every/some  indexOf/lastIndexOf  filter reduce Array.isArray

  10. 【Hi3516】 uboot下烧写BSP

    setenv serverip xx.xx.xx.xx setenv ipaddr xx.xx.xx.xx setenv ethaddr xx:xx:xx:xx:xx:xx setenv netmas ...