8

この質問Deleting a const pointerを読んでいて、動作についてもっと知りたいと思っていましたdelete。さて、私の理解によると:

delete expression次の 2 つのステップで機能します。

  1. デストラクタを呼び出す
  2. free()次に、 operator delete を呼び出してメモリを解放します (多くの場合は を呼び出します)。

operator deleteを受け入れますvoid*。テスト プログラムの一部としてオーバーロードしたところ、ポインターを受け入れないことがoperator deleteわかりました。operator deleteconst

演算子 delete は const ポインターを受け入れず、delete は内部的に演算子 delete を呼び出すため、const ポインターの削除はどのように機能しますか?

delete内部で const_cast を使用していますか?

4

5 に答える 5

13

const_cast は実際には何もしません。これは、コンパイラがオブジェクトの const-ness について不満を言うのを抑える方法です。deleteキーワードはコンパイラ構造であり、コンパイラはこの場合に何をすべきかを知っており、ポインターの const-ness を気にしません。

于 2009-04-16T13:45:46.453 に答える
4

この答えが言うdeleteように、他の方法とは異なり、オブジェクトを破壊する言語の一部です。const-ness は破壊可能性とは関係ありません。

于 2009-04-16T13:42:02.297 に答える
3

operator delete は void* を受け入れます。テスト プログラムの一部として、演算子 delete をオーバーロードしたところ、演算子 delete が const ポインターを受け入れないことがわかりました。

どうやってこれを試しましたか?確かにconst ポインターを受け入れます

#include <memory>

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

このコードは正しく、コンパイルされ (正当な警告が表示されますが)、実行されます。

編集: 元の記事を読む – あなたは const ポインターについて話しているのではなく、へのconstポインターについて話しています。これは別のものです。これが機能しなければならない理由はそこに記載されています。なぜそれが機能しているのかについては、他の人がこれを言っています。

于 2009-04-16T13:53:00.243 に答える
1

deleteオーバーロードできる演算子です。ポインタを引数として取り、メモリを解放しますfree。コンパイラーは、ポインターがそうであるかどうかにかかわらず、これを許可しますconst

于 2009-04-16T13:47:02.863 に答える
-1

deleteポインタが指すメモリの割り当てを解除する呼び出しを行うだけで、ポインタの値もオブジェクトも変更されません。したがって、ポインタまたは指しているオブジェクトdeleteの -ness とは何の関係もありません。const

于 2010-05-04T02:44:49.360 に答える