如果我有一個包含指針的模板類A
,並且A
具有將返回該指針的隱式轉換運算符,如果我打算將delete
應用於delete
以便我需要或應該爲運算符定義A
這個班的對象?如果我有運算符T *(),是否需要重載刪除?
回答
我相信你有類似以下內容:
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
用來釋放內存。
一般來說,當你想控制應該如何分配或釋放該類的動態對象的內存時,只需定義這些操作符。
您只需要定義運營商刪除如果您定義運營商新 - 在這種情況下,你幾乎必須這樣做。
這並不意味着某些東西不需要刪除您的A * - 但您不需要爲此定義任何操作符,它將在默認情況下起作用。
如果您類擁有這個指針,它應該在其析構函數刪除它。請注意,重載此操作符可能會造成混淆,因爲獲取指向對象的常用方法是通過獲取其地址。
刪除它的「析構函數」,是嗎? – 2011-03-30 17:16:33
@ Ernest:的確 - 固定的。 – 2011-03-30 17:17:56
關於你的第二點,你在想'操作員'嗎?重載「operator T *」不應該影響取對象的地址? – 2011-03-30 18:39:32
您是否需要定義一個隱式轉換運算符?A
真的需要定義一個隱式轉換運算符嗎?也許有一個簡單的T* get() const
方法返回指針,就像boost和std智能指針一樣。隱式轉換會造成各種麻煩。
- 1. 當我們重載新運算符時,是否有必要重載新運算符?
- 2. 運算符重載「運算符T *()」產生比較運算符?
- 3. 重載delete運算符來刪除庫
- 4. 我是否需要刪除此對象?
- 5. 是否dwscript支持運算符重載
- 6. Java是否支持運算符重載?
- 7. 如果我運行轉換,我是否需要刪除bitbucket repo並重新創建它?
- 8. 是否有可能在字符串上重載〜運算符?
- 9. QState的所有權。我是否需要刪除所有QStates?
- 10. 是否有可能通過重載算術運算符級聯重載提取運算符?
- 11. 在類中重載運算符是否需要使用__declspec(dllexport)(如果它們用於DLL項目中)?
- 12. 是否總是需要刪除MapReduce中的重複項?
- 13. 運算符重載 - 重載*
- 14. 我該如何重載[]運算符?
- 15. 如果我需要更換VBO,是否需要重建我的VAO?
- 16. 是否需要刪除靜態向量?
- 17. 是否有可能在C++中重載運算符「...」?
- 18. 如何重載運算符[] []
- 19. 重載運算符*
- 20. 重載運算符%
- 21. 重載++運算符
- 22. 重載+ =運算符
- 23. 運算符重載?
- 24. 重載運算符[]
- 25. 重載運算符=
- 26. 重載=運算符
- 27. 運算符重載(=)
- 28. 運算符重載
- 29. 重載運算符+
- 30. 運算符重載+ =
謝謝理查德。是的,這就像我最後一個例子一樣。我擔心原則上可能存在模棱兩可的情況:比如說有多個轉換操作符返回指針。 – user2023370 2011-03-30 19:47:04
如果你有多個轉換操作符到一個指針類型,那麼在對象上使用'delete'將是一個編譯錯誤。 C++'11的FDIS表示:「操作數應該有一個指向對象類型的指針,或者是一個具有單個非顯式轉換函數(12.3.2)的類類型,指向對象類型的指針。 – 2011-04-19 18:12:55