C++进阶--placement new/delete

//############################################################################
// 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();

猜你喜欢

转载自www.cnblogs.com/logchen/p/10182587.html