簡體   English   中英

delete如何處理指針常量?

[英]How does delete deal with pointer constness?

我正在閱讀這個問題刪除一個const指針 ,想要了解有關delete行為的更多信息。 現在,根據我的理解:

delete expression分為兩步:

  1. 調用析構函數
  2. 然后通過調用operator delete釋放內存(通常調用free() )。

operator delete接受void* 作為測試程序的一部分,我重載了operator delete ,發現operator delete不接受const指針。

由於operator delete不接受const指針而delete內部調用operator delete, 刪除const指針的工作原理是什么?

delete是否在內部使用const_cast?

const_cast並沒有真正做任何事情 - 這是一種抑制編譯器對對象常量的呻吟的方法。 delete關鍵字是一個編譯器構造,編譯器知道在這種情況下該做什么,而不關心指針的常量。

正如這個答案所說, delete不是任何其他方法,而是破壞對象的語言的一部分。 const -ness與可破壞性無關。

operator delete接受void *。 作為測試程序的一部分,我重載了operator delete,發現operator delete不接受const指針。

你是怎么試試這個的? 它當然不會接受常量指針:

#include <memory>

int main() {
    void* const px = 0;
    delete px;
    ::operator delete(px);
}

這段代碼是正確的,編譯(盡管有合理的警告)並執行。

編輯 :閱讀原始文章 - 你不是在談論一個const指針,而是一個指向const的指針 ,這是另一回事。 這里描述了必須工作的原因。 至於它為何起作用:其他人已經說過了。

delete是一個可以重載的運算符。 它將指針作為參數,並釋放內存,可能使用free 編譯器允許指針是否為const

delete只是調用釋放指針所指向的內存,它不會改變指針的值也不會改變對象。 因此, delete與指向的指針或對象的const -ness無關。

暫無
暫無

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

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