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

相关文章:

  • 2021-10-09
  • 2022-03-06
  • 2022-12-23
  • 2021-08-20
  • 2022-03-03
  • 2021-08-27
  • 2021-07-26
猜你喜欢
  • 2022-02-15
  • 2022-12-23
  • 2021-08-22
  • 2022-12-23
  • 2022-02-11
  • 2021-12-03
  • 2021-04-03
相关资源
相似解决方案