Ответ 1
free
не следует использовать с реальными объектами С++. free
следует использовать с malloc
, поэтому вы не должны использовать free
для того, что вы выделили с помощью new
.
Что касается причин, по которым вы можете delete
const-объекты, это просто:
const Type *ptr = new Type(...);
Теперь что? Если вы не можете удалить это, вам нужно будет сделать это:
delete const_cast<Type*>(ptr);
Наличие объекта const
означает, что его нельзя изменить. Вы не можете заставить объект перейти из одного состояния в другое. Удаление удаляет его. Это означает, что он больше не существует в каком-либо состоянии, будь то оригинал или какая-либо другая модифицированная форма. Удаление - это операция, которая существует вне состояния изменчивости объекта, подобно построению.
Концептуально удаление не является ни константой, ни константой. Хотя деструктор является неконстантной функцией, идея разрушения объекта просто выходит за пределы константы const или не const.
ОК, скажем, вы определяете operator delete
, чтобы взять указатель на const (который отличается от указателя const):
void operator delete(void const* p);
Какова первая строка этой функции? Цель operator delete
- освободить память, выделенную operator new
. Это потребует выталкивания битов в кучу выделения памяти. И для этого вам нужен указатель, который не указывает на данные const:
void *ptr = const_cast<void*>(p);
Добро пожаловать в undefined поведение. В то время как С++ позволяет это сделать, в спецификации очень ясно, что результаты попыток записи на ptr
(или любой адрес на основе этого) undefined. Вы получили указатель на const; вам сказали окружающий мир, чтобы он не изменил то, на что он указал. С++ не дает никаких гарантий относительно того, что происходит, когда вы нарушаете этот контракт.
Поскольку спецификация заявляет, что это поведение undefined, и поскольку operator delete
(в большинстве случаев) не может выполнять свою работу без изменения памяти, на которую указывает p
(или изменение памяти на основе этого адреса), это было бы глупо из спецификации, чтобы затем дать вам возможность определить operator delete
таким образом. В основном это было бы канонизировать идею стрельбы в ногу.
Да, практически в каждом случае это будет абсолютно безопасно. Но так как вы все равно откажетесь от const, почему бы вообще не позаботиться о довольно сомнительной идее?