//############################################################################
// Placement New 和 Placement Delete // 标准的Operator new/delete:
void* operator new(std::size_t size) throw(std::bad_alloc);
void operator delete(void* pMemory) throw(); /*
* Placement new: 除了size_t param参数外,还带其他额外参数的operator new
* Placement delete: 除了void* param参数外,还带其他额外参数的operator delete
*
* 注意: 他们需要成对提供
*/ static void* operator new(size_t szie, void* pMemory) throw(bad_alloc);
static void* operator delete(void* pMemory, void* pMemory) throw();
/*
* STL中提供. 新创建的对象将放在pMemory位置.
*/ int function_A() {
int buffer[100000];
dog* pd = new(buffer) dog();
} // 是否需要delete pd?
// 内存并不是在堆上分配,所以不需要释放,但是需要手动析构
// pd->Dog::~Dog(); //显式地调用析构函数
// 注意此析构方法,不能用于普通的在栈上分配的对象,否则离开作用域的时候会再析构一次
// 同样也不能用于普通的动态分配对象,只会析构,不会释放内存 class dog {
...
dog() { throw 20; }
static void* operator new(size_t szie, ostream& log) throw(bad_alloc){
log << "Customized new for dog.\n";
return ::operator new(size);
}
// static void* operator delete(void* pMemory, ostream& log) throw() {
// log << "Customized delete for dog.\n";
// free(pMemory);
// }
} ...
dog* pd = new(std::cout) dog();

C++进阶--placement new/delete的更多相关文章

  1. 写了placement new就要写placement delete

    "placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的 ...

  2. Effective C++ -----条款52:写了placement new 也要写 placement delete

    当你写一个placement operator new ,请确定也写出了对应的placement operator delete.如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏. 当你声明 ...

  3. 读书笔记 effctive c++ Item 52 如果你实现了placement new,你也要实现placement delete

    1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉.当你像下面 ...

  4. 读书笔记 effective c++ Item 52 如果你实现了placement new,你也要实现placement delete

    1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉.当你像下面 ...

  5. 条款52:谢了placement new 也就同时应该写一个placement delete

    如果operator new接收到的参数除了size_t之外还有其他的话,那么这个operator new实际上就是一个placement new,所以考虑下下面这样的情况: 一个可以用来记录信息的p ...

  6. 条款52:写了placement new 也要写placement delete(write placement delete if you write placement new)

    NOTE: 1.当你写一个placement operator new .请确定也要写出了对应的placement operator delete.如果没有这样做,你的程序可能发生隐晦而时断时续的内存 ...

  7. C++ delete 和 delete []

    C++ delete 和 delete [] 简单结论: new delete new [] delete []   文章 : 对 delete [] 的声明 void operator delete ...

  8. C++ 中 new 操作符内幕:new operator、operator new、placement new

    一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...

  9. Effective C++ —— 定制new和delete(八)

    STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...

随机推荐

  1. POJ 2751:Seek the Name, Seek the Fame(Hash)

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24077   Ac ...

  2. 06 面向对象:多态&抽象类&接口&权限修饰符&内部类

    多态: /* 多态(polymorphic)概述 * 事物存在的多种形态 多态前提 * a:要有继承关系. * b:要有方法重写. * c:要有父类引用指向子类对象. * 成员变量 * 编译看左边(父 ...

  3. 初始While循环和for循环

    While循环 While循环,是一个循环加判断的组合,满足判断条件返回 真(True)开始循环代码块,不满足判断条件返回 假(False)不循环 格式: While 条件: 代码块 注意:在Whil ...

  4. 【BZOJ3144】【HNOI2013】切糕

    总算做了一道2011以后的省选题了……原题: 图片题面好评! P,Q,R≤40,0≤D≤R,给出的所有的不和谐值不超过1000. 文本样例好评! 恩这个是听妹主席讲过后会写的,首先把每个点拆成链,那么 ...

  5. hasura graphql-engine graphql2chartjs 方便的graphql 转换chartjs 的类库

    graphql2chartjs 是hasura graphql-engine 团队开源的方便graphql 转换为chartjs 的类库,我们可以方便的 用来进行ChartJS chart 开发 一张 ...

  6. mysql存储程序

    什么时候会用到存储过程 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度2.当对数据库进行复杂操作时 ...

  7. oracle-sql内置函数

    函数  oracle 自定义函数入门 主题:ORACLE函数大全 ############################### set operators UNION, UNION ALL, INT ...

  8. learnopengl“入门”的全部代码

    projection 里的角度,角度越大,物体离摄像机越远:角度越小,物体离摄像机越近,这个角度表示视野(fov),视野越大,看到的物体就越小 头文件 #ifndef SHADER_H_INCLUDE ...

  9. HBase启动后RegionServer自动挂原因及解决办法

    zookeeper在同步和管理集群时依赖节点系统时间,每隔一定周期zookeeper master会监测所有节点的连接状态.所以解决办法就是利用ntp对集群局域网进行时间同步. CentOS设置系统时 ...

  10. C编程技巧资源

    Keil C 位变量外部引用的方法 https://blog.csdn.net/zh458042230/article/details/8627604 单片机Keil C51 C语言多文件如何使用全局 ...