C ++ удалить static_cast <void *> (указатель) поведение - PullRequest
4 голосов
/ 25 апреля 2010

предположим, что код выполняет следующие действия:

T *pointer = new T();
delete static_cast<void*>(pointer);

каков результат? Не определено, утечка памяти, память удалена?

Ответы [ 2 ]

7 голосов
/ 25 апреля 2010

Поведение не определено. Что касается выражения удаления, стандарт C ++ гласит:

В первом альтернативном варианте ( удалить объект ), если статический тип операнда отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено. Во втором альтернативном варианте ( delete array ), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено. (§5.3.5 / 3)

Тогда в сноске к этому абзацу четко говорится:

Это означает, что объект нельзя удалить с помощью указателя типа void*, поскольку нет объектов типа void (примечание 73).

1 голос
/ 25 апреля 2010

Удаление через указатель void не определено, как и все остальное через указатель void, кроме явного преобразования его в указатель другого типа.

...