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

0

C++

Много литературы говорит const ссылки не могут быть использованы для изменения их референты и const указатели не могут быть использованы для изменения их pointees.

Тогда почему они могут delete d?

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

Я знаю, что конечный const в T* const запрещает переустановку указателя, но ниже я использую две const s, как в const T* const, для выделения. Почему следующим указателем может быть delete d?

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&) и версий non-leading-const указателя const const snippet (int* const и int*) дает тот же результат, что и их более сопоставимые копии. Во всех 5 случаях, почему и как продлевается срок действия временного нового выражения?

Предполагая, что соответствующий оператор не был перегружен, явно удален или сделан непубличным, если тип данных является классом или структурой, делает ли Стандарт следующие гарантии:

  • Оператор разыменования обеспечивает прямой доступ к указателю

  • new оператор создает указатель на динамически распределенную память, а не динамически распределенную копию исходной динамически распределенной памяти

Если вместо этого new оператор был перегружен, но все еще был возвращен ::operator new(size) и оператор разыменования был перегружен, но все же вернул ссылку на объект, есть ли побочные эффекты, которые бы не удерживали эти две точки?

Теги:
delete-operator
new-operator

2 ответа

2
Лучший ответ

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

Как очень простой мысленный эксперимент, рассмотрите этот код:

{
    const int x = 0;
}

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

2

"const" во всех ваших примерах запрещает вам изменять переменную через назначение. Это все, что он делает. Это не предотвращает удаление памяти.

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

В вашем втором примере "const int * const cipcDynamic" первый const запрещает вам изменять место, указанное указателем, например "* cipcDynamic = 2", второй const запрещает вам изменять сам указатель, указывая на другое место, например "cipcDynamic = new int".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню