前言
学习自用,目前这篇文章理解还挺初级的,等以后再改善把
文末的参考资料都是好文,[1]为malloc(0),面试常问,[2]为C++placement new相关
正文
placement new作用:在指定内存里进行对象构造
placement new应用场景:
-
cpp里new的实现
-
如果有不断相同数据结构创建并被销毁,可以用placement new来代替new,这样操作系统就不会每次去找另外的空间而造成内存碎片了
空间申请有operator new和malloc两种操作,两种方法功能基本一致,但不同的系统实现方式不一样
cpp new的实现:
new相当于是operator new和调用构造函数的复合操作。如下代码
Complex *pc = new Complex(1,2);
//等价于:
Complex *pc;
try {
void *mem = operator new( sizeof(Complex) );
pc = static_cast<Complext *>(mem);
pc->Complex::Complex(1,2);
}
catch( std::bad_alloc ) {/*如果allocation失败,就不执行constructor*/}
如果分配空间不足:
new的话默认会抛出bad_alloc异常,
A* a = new(std::nothrow) A; 则直接返回NULL,malloc会返回一个空指针
typedef void (*new_handler)();//抛出异常之前会先调用一个可以由你指定的handler方法 new_handler set_ne