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

2 ответа

Решение

Константность влияет на сами объекты. 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".

Другие вопросы по тегам