C ++
Много литературы говорит const
ссылки не могут быть использованы для изменения своих ссылок и const
указатели не могут быть использованы для изменения своих указателей.
Тогда почему они могут быть delete
д?
const int& cirDynamic = *( new int(5) );
// ^ 'const int& cirDynamic = *( &( *( new int(5) ) ) );' gives same output below
cout << cirDynamic << endl; // 5
delete &cirDynamic;
cout << cirDynamic << endl; // garbage value
Я знаю константный констант в T* const
только предотвращает переустановку указателя, но ниже я использую два const
с, как в const T* const
для акцента. Почему следующий указатель может быть delete
д?
const int* const cipcDynamic = new int(5);
// ^ 'const int* const cipcDynamic = &( *( new int(5) ) );' gives same output below
cout << *cipcDynamic << endl; // 5
delete cipcDynamic;
cout << *cipcDynamic << endl; // garbage value
Вывод показывает, что по крайней мере некоторая динамически выделенная память была освобождена. Было ли все это освобождено, или могло быть копирование, когда только копия была освобождена?
Неконстантная версия фрагмента справочника const (int&
) и не являющиеся ведущими версиями фрагмента const указателя const (int* const
а также int*
) производить тот же результат, что и их более постоянные аналоги. Во всех 5 случаях, почему и как продлевается время жизни временного нового выражения?
Предполагая, что соответствующий оператор не был перегружен, явно удален или не стал общедоступным, если тип данных является классом или структурой, Стандарт дает следующие гарантии:
Оператор разыменования обеспечивает прямой доступ к pointee
new
Оператор выдает указатель на динамически выделенную память, а не на динамически выделенную копию исходной динамически выделяемой памяти
Если вместо new
оператор был перегружен, но все еще вернулся ::operator new(size)
и оператор разыменования был перегружен, но все еще возвращал ссылку на объект, есть ли побочные эффекты, которые бы не поддерживали эти две точки?
Константность влияет на сами объекты. new
а также delete
и конструкторы влияют на создание объектов. Нет смысла спрашивать, являются ли конструкторы или деструкторы const
потому что они запускаются до или после того, как объект существует. Точно так же вы можете создавать и уничтожать постоянные объекты динамически, и / или вы можете управлять динамически созданными объектами через постоянные указатели или ссылки.
В качестве очень простого мысленного эксперимента рассмотрим этот код:
{
const int x = 0;
}
Это не сработало бы, если бы константность могла помешать объекту x
от уничтожения.
‘const’ во всех ваших примерах только мешает вам изменить переменную посредством присваивания. Это все, что он делает. Это не мешает удалить, чтобы восстановить память.
В вашем первом примере «const int& cirDynamic «запрещает вам писать что-то вроде» cirDynamic = 2 «. Но это законно — брать адрес cirDynamic (который даст вам указатель» const int * «), и удаление будет успешно работать с указателями const.
Во втором примере, «const int * const cipcDynamic», первый const не позволяет вам изменить место, на которое указывает указатель, например «* cipcDynamic = 2», а второй const не позволяет вам изменить сам указатель, чтобы он указывал на другое место Например, «cipcDynamic = new int».