[英]Overloading new, delete in C++
我發現這一行是stroustrup An operator function must either be a member or take at least one argument of a user-defined type (functions redefining the new and delete operators need not).
運算符new和operator delete是否將用戶定義的類型作為其參數之一? 這是什么意思,我在這里錯過了一些東西
Stroustrup的引用顯然適用於運算符重載 。 C ++語言僅支持用戶定義類型的運算符重載。 這意味着重載函數( operator <something>
)必須是用戶定義類型的成員,或者是具有至少一個用戶定義類型參數的獨立函數。 這正是相關報價的含義。
但是,獨立(非成員) operator new
和operator delete
函數不需要將用戶定義類型的值作為其參數之一。 這可能被視為與您的引語相矛盾的內容。
然而,實際上並沒有矛盾。 這些運算符並沒有真正超載 。 當您提供自己的獨立operator new
/ operator delete
版本時,您實際上正在替換庫提供的那些。 這是語言規范中的官方術語: 替換 ,而不是重載 。 這就是為什么上面的引用並不真正適用於operator new
和operator delete
。
您可以重載正常的全局new
運算符,如果您願意,可以為所有類添加功能(例如日志記錄或泄漏檢測),但是無法調用new
運算符的舊定義,因此您可能會卡住調用malloc()
從重新定義的operator new
里面實際獲取你需要的內存。
a + b
只是a.operator+(b)
或operator+(a, b)
語法糖。
另一方面, new Foo(x, y, z)
不僅僅是operator new(Foo, x, y, z)
類似語法糖或類似的東西。 它更復雜:
void* address = operator new(sizeof(Foo)); // here is the behavior you can replace
try {
new(address) Foo(x, y, z);
} catch (...) {
operator delete(address);
}
正如您所看到的,函數operator new
僅僅分配內存,這只是運算符new
實際執行的內存的一半。 在我看來,將命名為allocate_memory
或類似的東西更有意義。 它絕對不是像operator+
這樣的operator+
。
operator new
和operator delete
是基於操作數的類型抬頭new
或delete
的表達,任何額外的括號參數new
。 因此,它們可能會過載(並且operator new
會受到重載解析),但是與其他運算符的機制不同。 (C ++03§13.5/ 5)
由於它們使用原始內存,因此它們從不處理指向客戶端類類型的指針。 operator new
始終采用size_t
參數(可能還有其他參數,其中沒有一個需要是用戶定義的類型)並返回void *
。 operator delete
始終采用void *
參數和可選的size_t
,無論它是如何查找的。
我可以想到兩個原因:
operator new
或operator delete
嘗試訪問返回的內存塊中的對象始終是一個錯誤。 (存儲器不用於構造對象,但是,是公平的游戲。) operator new
或operator delete
可以是多重和/或虛擬繼承的,這樣所討論的void*
不能通過任何voodoo指向尚未構造或已經被破壞的子對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.