2011-03-30 93 views

回答

2

我相信你有類似以下內容:

template <typename T> 
struct A { 
    T * t; 
    operator T*() { return t; } 
}; 

的打算「應用delete這一類的對象」,所以由我假設你的意思是:

void foo() 
{ 
    A<int> * p = new A<int>; 
    delete p;  // Applying 'delete' 
} 

如果是這種情況,那麼正確刪除的調用會破壞對象並釋放在前一行使用'new'分配的內存,並且對您的問題的回答爲'no'。

因爲您已聲明轉換運算符的指針,所以能夠A<int>類型的對象(一個反對A<int>*)上使用delete。採用delete將被應用到調用轉換操作符的結果:

如何刪除作品
void foo() 
{ 
    A<int> a; 
    a.t = new int; 
    delete a;  // Same as: delete a.operator T*() 
} 

基礎:

表達delete p,做兩個不同的東西。首先,它調用p指向的對象的析構函數,然後釋放內存。如果你爲你的類定義了一個operator delete成員,那麼這個函數將被delete p用來釋放內存。

一般來說,當你想控制應該如何分配或釋放該類的動態對象的內存時,只需定義這些操作符。

+0

謝謝理查德。是的,這就像我最後一個例子一樣。我擔心原則上可能存在模棱兩可的情況:比如說有多個轉換操作符返回指針。 – user2023370 2011-03-30 19:47:04

+0

如果你有多個轉換操作符到一個指針類型,那麼在對象上使用'delete'將是一個編譯錯誤。 C++'11的FDIS表示:「操作數應該有一個指向對象類型的指針,或者是一個具有單個非顯式轉換函數(12.3.2)的類類型,指向對象類型的指針。 – 2011-04-19 18:12:55

5

您只需要定義運營商刪除如果您定義運營商新 - 在這種情況下,你幾乎必須這樣做。

這並不意味着某些東西不需要刪除您的A * - 但您不需要爲此定義任何操作符,它將在默認情況下起作用。

2

如果您類擁有這個指針,它應該在其析構函數刪除它。請注意,重載此操作符可能會造成混淆,因爲獲取指向對象的常用方法是通過獲取其地址。

+0

刪除它的「析構函數」,是嗎? – 2011-03-30 17:16:33

+0

@ Ernest:的確 - 固定的。 – 2011-03-30 17:17:56

+0

關於你的第二點,你在想'操作員'嗎?重載「operator T *」不應該影響取對象的地址? – 2011-03-30 18:39:32

0

您是否需要定義一個隱式轉換運算符?A真的需要定義一個隱式轉換運算符嗎?也許有一個簡單的T* get() const方法返回指針,就像boost和std智能指針一樣。隱式轉換會造成各種麻煩。