1. 程式人生 > >C++進階--placement new/delete

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