是否有之間的差異:該運營商的其他版本哪個操作員刪除?
operator delete(some_pointer);
和
delete some_pointer;
,如果是有什麼不同,和其中一個應該使用一個,在哪裏? 謝謝。
是否有之間的差異:該運營商的其他版本哪個操作員刪除?
operator delete(some_pointer);
和
delete some_pointer;
,如果是有什麼不同,和其中一個應該使用一個,在哪裏? 謝謝。
具有諷刺意味的是,delete
運營商和operator delete()
不是一回事。
delete some_pointer;
調用some_pointer
指向的對象的析構函數,然後調用operator delete()
釋放內存。
您通常不會直接調用operator delete()
,因爲如果這樣做,對象的析構函數將不會被調用,並且您可能最終會發生內存泄漏。
你唯一需要關心的是operator delete()
是當你想通過覆蓋operator new()
和operator delete()
做你自己的內存管理。
要知道,你應該知道delete
和delete []
是兩個不同的東西。
這正是我正在尋找的。謝謝。 – 2010-08-27 19:20:37
delete some_pointer;
是「正確的」使用。
operator delete(some_Pointer);
主要存在於定義您自己的刪除操作符的語法工件中。也就是說,因爲你定義了一個加號運算符爲;
myclass::operator+(myclass b) {....}
你真的可以這樣寫:
myclass c = a.operator+(b);
但從來沒有人做到這一點。他們使用:
myclass c = a + b;
同樣,你可以寫operator delete(some_Pointer);
,但從來沒有人做過。
他們實際上不是一回事...... – Dima 2010-08-27 19:10:09
@Dima:我在答案的哪一點我說他們是同一個東西?我剛剛說過使用「刪除some_Pointer」,你可以,但沒有人會使用另一種形式。 – 2010-08-27 19:19:59
你的答案似乎還不清楚...... – 2010-08-27 19:25:40
operator delete()
只是釋放內存。 delete some_pointer
調用some_pointer
的析構函數,然後調用operator delete()
。
至少在我的經驗,這是更常見的實施operator new
和operator delete
比實際使用(即調用)他們,至少直接。
通常,您間接使用operator new
和operator 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 [] new
和operator [] delete
,當/如果你分配/刪除其使用數組 - 但在普通版本和陣列版本之間不一定有任何真正的區別 - 它們都只是分配一定數量的原始內存(儘管您可能會猜測數組版本將分配相對較大的內存量,並在此基礎上進行一些優化)。
在任何情況下,如果您想優化爲特定類的對象分配內存的方式,請將其重載。有許多現有的實現可以放入並使用,特別是在您希望分配大量小對象的情況下,因此您需要最大限度地減少與每個分配相關的開銷(例如,Loki的小塊HeapLayers分配器)。
一個有趣的小花絮:operator new
,operator [] new
,operator 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
的東西來存儲,你可能需要/想要做同樣的事情。
謝謝偉大的答案 – 2010-08-28 17:55:08
可能的重複[delete vs delete \ [\]在C++中的運算符](http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c) – 2010-08-27 19:07:40
相關http:// stackoverflow .com/questions/1913343/how-could-pairing-new-with-delete-possible-lead-to-memory-leak-only – 2010-08-27 19:08:08
@ 0A0D:這個問題與數組刪除無關。 – UncleBens 2010-08-27 19:14:32