C++進階--placement new/delete
阿新 • • 發佈:2018-12-26
//############################################################################ // 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();