Как delete справляется с константностью указателя? - PullRequest
8 голосов
/ 16 апреля 2009

Я читал этот вопрос Удаление константного указателя и хотел узнать больше о delete поведении. Теперь, согласно моему пониманию:

delete expression работает в два этапа:

  1. вызвать деструктор
  2. затем освобождает память (часто с вызовом free()), вызывая оператор delete.

operator delete принимает void*. Как часть тестовой программы я перегружал operator delete и обнаружил, что operator delete не принимает указатель const.

Поскольку оператор удаления не принимает константный указатель и внутреннее удаление оператора вызова вызывает удаление, как Удаление константного указателя работает?

Использует ли delete const_cast для внутреннего использования?

Ответы [ 5 ]

13 голосов
/ 16 апреля 2009

const_cast на самом деле ничего не делает - это способ подавить стон компилятора о постоянстве объекта. delete ключевое слово является конструкцией компилятора, компилятор знает, что делать в этом случае и не заботится о постоянстве указателя.

4 голосов
/ 16 апреля 2009

Поскольку этот ответ говорит, delete не метод, как любой другой, но часть языка для разрушения объектов. const -несс не имеет отношения к разрушаемости.

2 голосов
/ 16 апреля 2009

оператор delete принимает void *. Как часть тестовой программы я перегружен оператором удаления и обнаружил, что оператор удаления не принимает константный указатель.

Как ты это попробовал? Конечно, принимает константные указатели:

#include <memory>

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

Этот код верен, компилируется (хотя и с обоснованным предупреждением) и выполняется.

РЕДАКТИРОВАТЬ : чтение оригинальной статьи - вы говорите не о константном указателе, а указателе на const, что является чем-то другим. Причина, почему это должно работать, описана там. Что касается того, почему это работает: другие сказали это.

1 голос
/ 16 апреля 2009

delete - оператор, который вы можете перегрузить. Он принимает указатель в качестве аргумента и освобождает память, возможно используя free. Компилятор позволяет это независимо от того, является ли указатель const или нет.

0 голосов
/ 04 мая 2010

delete просто вызывает освобождение памяти, на которую указывает указатель, это не меняет значение указателя или объекта. Следовательно, delete не имеет ничего общего с const -очностью указателя или объекта, на который указывает.

...