new-выражение и delete-выражение для константной ссылки и константного указателя

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) и оператор разыменования был перегружен, но все еще возвращал ссылку на объект, есть ли побочные эффекты, которые бы не поддерживали эти две точки?

0

Решение

Константность влияет на сами объекты. new а также delete и конструкторы влияют на создание объектов. Нет смысла спрашивать, являются ли конструкторы или деструкторы constпотому что они запускаются до или после того, как объект существует. Точно так же вы можете создавать и уничтожать постоянные объекты динамически, и / или вы можете управлять динамически созданными объектами через постоянные указатели или ссылки.

В качестве очень простого мысленного эксперимента рассмотрим этот код:

{
const int x = 0;
}

Это не сработало бы, если бы константность могла помешать объекту x от уничтожения.

2

Другие решения

‘const’ во всех ваших примерах только мешает вам изменить переменную посредством присваивания. Это все, что он делает. Это не мешает удалить, чтобы восстановить память.

В вашем первом примере «const int& cirDynamic «запрещает вам писать что-то вроде» cirDynamic = 2 «. Но это законно — брать адрес cirDynamic (который даст вам указатель» const int * «), и удаление будет успешно работать с указателями const.

Во втором примере, «const int * const cipcDynamic», первый const не позволяет вам изменить место, на которое указывает указатель, например «* cipcDynamic = 2», а второй const не позволяет вам изменить сам указатель, чтобы он указывал на другое место Например, «cipcDynamic = new int».

2

По вопросам рекламы [email protected]