簡體   English   中英

重載新的,在C ++中刪除

[英]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 newoperator delete函數不需要將用戶定義類型的值作為其參數之一。 這可能被視為與您的引語相矛盾的內容。

然而,實際上並沒有矛盾。 這些運算符並沒有真正超載 當您提供自己的獨立operator new / operator delete版本時,您實際上正在替換庫提供的那些。 這是語言規范中的官方術語: 替換 ,而不是重載 這就是為什么上面的引用並不真正適用於operator newoperator 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 newoperator delete是基於操作數的類型抬頭newdelete的表達,任何額外的括號參數new 因此,它們可能會過載(並且operator new 受到重載解析),但是與其他運算符的機制不同。 (C ++03§13.5/ 5)

由於它們使用原始內存,因此它們從不處理指向客戶端類類型的指針。 operator new始終采用size_t參數(可能還有其他參數,其中沒有一個需要是用戶定義的類型)並返回void * operator delete始終采用void *參數和可選的size_t ,無論它是如何查找的。

我可以想到兩個原因:

  • 它們處理原始內存,不包含構造對象。 operator newoperator delete嘗試訪問返回的內存塊中的對象始終是一個錯誤。 (存儲器用於構造對象,但是,是公平的游戲。)
  • 類成員operator newoperator delete可以是多重和/或虛擬繼承的,這樣所討論的void*不能通過任何voodoo指向尚未構造或已經被破壞的子對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM