2010-11-16 72 views
1

任何人我關於構造壓倒一切..重寫操作

我在我的課有這個

void operator delete(void*) {} 

void operator delete(void* p, void*) {} 

..看起來像重載(相同的函數名和返回類型,但不同的參數列表),但其壓倒一切..怎麼了壓倒一切的..

人的解釋我這兩條線的功能。

+0

你能否使用刪除表達式調用第二次重載? – Chubsdad 2010-11-16 06:41:04

+0

其不超載..其超載..其實我並不瞭解這兩個功能 – Model 2010-11-16 06:47:37

+0

有一個問題:爲什麼?詳細說明;你想達到什麼目的?如果你想在你的類被釋放時想要特別的行爲,那就寫一個析構函數。 – Ashe 2010-11-16 07:10:30

回答

0

他們重載delete運算符,而第二個是使用「位置刪除」。 Placement new/delete是一種黑客攻擊,因此您可以讓C++構造函數在您提供的內存之上初始化該類(而不是:: new),並可能使用其他參數(如您在此處看到的內容)。谷歌可以填補你的血淋淋的細節。

+0

不,我不明白.. – Model 2010-11-16 06:55:46

+1

這是C++的一個討厭的角落。通常當你調用new和delete時,你將使用C++編譯器的實現來實際分配和釋放內存。 C++可以讓你重寫這個行爲,並且你可以聲明你自己的新版本和刪除版本。如果你(或其他作者)這樣做,你可以做各種瘋狂的(有時是有用的)事情,並且你可以添加額外的參數給新的和刪除的調用。這個話題比我現在可以深入一點,但Google對於「放置新的」和「放置刪除」有更深的理解,並且您會發現很多信息。 – xscott 2010-11-16 07:02:39

+0

ahhan ok謝謝! – Model 2010-11-16 07:22:44

1
void operator delete(void*) {} 
void operator delete(void* p, void*) {} 

這些是自定義釋放函數。通過delete表達式調用釋放函數。例如。

YourClass* p = new YourClass(); // Allocates memory & calls constructor 
// ... whatever, then 
delete p;       // Calls destructor & deallocates memory 

對於你的類中的最後一行的delete表達上述將第一調用析構函數,然後將其稱之爲單void*參數釋放函數,所述類定義中,第一的你的兩個功能,如果該取消分配是可訪問的。

但是,可能是因爲使其無法訪問,釋放函數被聲明爲privateprotected。在第一種情況下,delete表達式在類自己的代碼之外將不會編譯(不可訪問的釋放函數)。如果是這樣的話,那可能就是整個問題 - 或者,如果沒有意義的話,不要感到驚訝。

順便問一下,看看this tutorial。這顯然是網絡上對C++最不好的免費介紹。 Bruce Eckel的電子書"Thinking in C++"也是免費的,但它有一些錯誤和錯誤信息(它曾經是另一種方式,但在cplusplus.com的教程曾經非常糟糕,曾經)。

乾杯&心連心,

+2

現在我覺得我應該買一本C++書..很快 – Model 2010-11-16 07:37:24

+1

+1在C++中思考是一本很好的書,對於那些首先了解編程的人來說。如果你知道書中的一些錯誤,我敢打賭,如果你爲他指出這些錯誤,Eckel會很高興。 – daramarak 2010-11-16 09:16:24

+0

@daramarak我提到過關於錯誤,因爲好的布魯斯並沒有修正報告的錯誤,所以,多年來人們一次又一次地提出了相同的問題。乾杯, – 2010-11-16 09:29:42

0

這些是運營商刪除超載,當delete在對象上調用被調用。從3.7.3.2(取消分配函數):

每個釋放函數應返回void,其第一個參數應爲void *。解除分配功能 可以有多個參數。 如果一個類T具有名爲operator 正好與一個參數刪除一個成員釋放函數,則該函數是通常的(非配置)釋放函數。如果 類T不聲明這樣的操作者刪除,但確實聲明一個成員釋放函數 名爲operator正好用兩個參數,一個具有輸入第二個刪除的std ::的size_t (18.1),則該函數是通常的解除分配功能。

,12。5免費存儲:

當執行delete表達式,所選擇的釋放函數應具有的 存儲的塊的地址稱爲要回收作爲第一個參數,並(如果兩參數樣式被使用)的大小爲 該塊作爲其第二個參數

我不確定你的第二個函數是否可以被調用,因爲它不是'通常的釋放函數'。

+0

它可以手動調用,或者如果構造函數拋出,它可以通過調用相應位置new的'new'表達式來調用。這是自動調用展示位置刪除的唯一情況。微軟曾經打擊過使用placement new來幫助調試的「聰明」想法,但卻忘了定義相應的位置刪除。結果是內存被泄漏,但只在調試版本中...... :-)這是最臭名昭着的MFC錯誤之一。乾杯, – 2010-11-16 07:35:45

+0

@Alf我沒有意識到這一點,謝謝:) – icecrime 2010-11-16 07:37:43