2010-08-27 75 views
14

是否有之間的差異:該運營商的其他版本哪個操作員刪除?

operator delete(some_pointer); 

delete some_pointer; 

,如果是有什麼不同,和其中一個應該使用一個,在哪裏? 謝謝。

+0

可能的重複[delete vs delete \ [\]在C++中的運算符](http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c) – 2010-08-27 19:07:40

+0

相關http:// stackoverflow .com/questions/1913343/how-could-pairing-new-with-delete-possible-lead-to-memory-leak-only – 2010-08-27 19:08:08

+2

@ 0A0D:這個問題與數組刪除無關。 – UncleBens 2010-08-27 19:14:32

回答

22

具有諷刺意味的是,delete運營商和operator delete()不是一回事。

delete some_pointer;調用some_pointer指向的對象的析構函數,然後調用operator delete()釋放內存。

您通常不會直接調用operator delete(),因爲如果這樣做,對象的析構函數將不會被調用,並且您可能最終會發生內存泄漏。

你唯一需要關心的是operator delete()是當你想通過覆蓋operator new()operator delete()做你自己的內存管理。

要知道,你應該知道deletedelete []是兩個不同的東西。

+2

這正是我正在尋找的。謝謝。 – 2010-08-27 19:20:37

2

delete some_pointer;是「正確的」使用。

operator delete(some_Pointer);主要存在於定義您自己的刪除操作符的語法工件中。也就是說,因爲你定義了一個加號運算符爲;

myclass::operator+(myclass b) {....} 

你真的可以這樣寫:

myclass c = a.operator+(b); 

但從來沒有人做到這一點。他們使用:

myclass c = a + b; 

同樣,你可以寫operator delete(some_Pointer);,但從來沒有人做過。

+2

他們實際上不是一回事...... – Dima 2010-08-27 19:10:09

+0

@Dima:我在答案的哪一點我說他們是同一個東西?我剛剛說過使用「刪除some_Pointer」,你可以,但沒有人會使用另一種形式。 – 2010-08-27 19:19:59

+3

你的答案似乎還不清楚...... – 2010-08-27 19:25:40

6

operator delete()只是釋放內存。 delete some_pointer調用some_pointer的析構函數,然後調用operator delete()

2

至少在我的經驗,這是更常見的實施operator newoperator delete比實際使用(即調用)他們,至少直接。

通常,您間接使用operator newoperator delete - 您會編寫new expression,如A *a = new A;。爲了實現這一點,編譯器生成調用operator new分配原始內存的代碼,然後調用一個A::A到原始內存轉換爲A對象,就像如果你寫:

void *temp = operator new(sizeof A); // allocate raw memory with operator new 
A *a = new(temp) A;     // convert raw memory to object with placement new 

當你完成與對象一起使用delete A;。要實現的是,編譯器調用該對象的析構函數,然後釋放內存,大致是你會做:

a->~A(); 
operator delete(a); 

也有operator [] newoperator [] delete,當/如果你分配/刪除其使用數組 - 但在普通版本和陣列版本之間不一定有任何真正的區別 - 它們都只是分配一定數量的原始內存(儘管您可能會猜測數組版本將分配相對較大的內存量,並在此基礎上進行一些優化)。

在任何情況下,如果您想優化爲特定類的對象分配內存的方式,請將其重載。有許多現有的實現可以放入並使用,特別是在您希望分配大量小對象的情況下,因此您需要最大限度地減少與每個分配相關的開銷(例如,Loki的小塊HeapLayers分配器)。

一個有趣的小花絮:operator newoperator [] newoperator delete和運營商[]在其聲明/定義刪除are always靜態class members, even if you don't explicitly include static`。

全球有四種版本(::operator new,::operator [] new,::operator delete::operator [] delete)。這些標誌着「內部」C++內存管理與外部世界之間的「邊界」。通常他們會從操作系統中分配相對較大的內存塊,然後根據請求將較小的內存塊返回到程序的其餘部分。如果你想(嘗試)優化你的整個程序的內存管理,你通常會通過重載(或者真的取代)來完成它們。再次,典型的原因是如果你期望分配很多小對象(但不是在幾個類中)。其中一個例子是Boost Pool庫。

的上述任何直接使用通常只限於在您需要的原料內存塊的情況下,對象。一個例子就是實現你自己的容器類。例如,std::vector通常使用::operator new(通過分配器對象)分配存儲對象的內存。由於它需要能夠分配存儲空間,但是隻有在以後(或者從不)在該存儲中創建對象時,它不能僅僅使用像data = new T[size];這樣的東西 - 它必須分配原始內存,然後使用放置new來創建對象將內存添加到集合中時(例如,當您的對象爲push_back時)。 std::deque也是如此。如果你想(例如)從頭開始實現自己的循環緩衝區,直接處理所有的內存管理,而不是使用類似vector的東西來存儲,你可能需要/想要做同樣的事情。

+0

謝謝偉大的答案 – 2010-08-28 17:55:08