【52】写了placement new也要写placement delete
1、Widget* pw = new Widget; 調用了兩個方法:第一個方法是operator new 負責分配內存;第二個方法是在分配的內存上構造Widget,即調用Widget的default構造方法。
2、那么問題來了,如果operator new分配內存成功,而Widget構造拋出異常,這種情況下,pw還沒有賦值,這不就導致資源泄露了?
不會造成資源泄露,因為C++運行系統保證調用delete釋放資源。
3、正常的operator new 如下:
void* operator new(std::size_t) throw (std::bad_alloc);
正常的operator delete如下:
void operator delete (void* rawMemory) throw(); // global作用域中的正常簽名式
void operator delete (void* rawMemory,std::size_t size) throw (); //class 作用域中典型的簽名式
除了上面的operator new,還有重載operator new,這些重載的new稱為placement new,其中有一個比較特殊的,如下:
void* operator new (std::size_t, void* pMemory) throw ();
當我們使用new在堆上申請內存時,編譯器嘗試找到一塊內存。而上面的placement new是說,不要去找內存了,直接分配在pMemory上。
4、現在問題來了,存在多個重載的operator new,當我們調用一個重載的new,出現上面的情況,即構造Widget出現異常,運行時該調用哪個delete呢?
做法是:調用一個與operator new 對應的operator delete,如果沒有這樣的delete,那么運行時系統什么也不做。這就必然導致資源泄漏。因此,為了避免這種情況下,用戶必須保證operator new 存在與它對應的operator delete。
5、上面delete的調用,是說,使用operator new,構造對象時出現異常,運行期系統調用與之對應的operator delete。正常情況下,delete pw調用正常的delete。
6、為了避免漏掉相關的delete,可以建立一個父類,其它類繼承,共享這些方法。需要注意的是,繼承會導致掩蓋同名稱的成員,因此需要在子類中使用using XXX。
轉載于:https://www.cnblogs.com/nzbbody/p/3532805.html
總結
以上是生活随笔為你收集整理的【52】写了placement new也要写placement delete的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows平台编译Webkit
- 下一篇: TJU1001