powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++17 и константные указатели на динамическую память
33 сообщений из 33, показаны все 2 страниц
C++17 и константные указатели на динамическую память
    #39878661
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
int main()
{
   int* const ptr = new int{};
   delete ptr;
}


Как известно, при освобождении памяти значения всех указателей меняются:
basic.stc/4When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.Но менять значения константных объектов нельзя (приводит к неопределённому поведению):
dcl.type.cv/4Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.
Получается, строка `delete ptr;` приводит к неопределённому поведению, т.к. (косвенно) меняет значение константного объекта?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878663
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis,

в приведенной цитате ничего не сказано что там что-то меняется. Там сказано, что освобожденная область, на которую смотрел указатель для него становится невалидной . То есть дальше ей будет рулить менеджер памяти, который может пометить для себя данный блок как свободный, но при этом никак его не менять его содержимого. Тем более менять ваш указатель, про который он вообще ничего не знает. Если пользователь после освобождения полезет что-то менять по "висячему" указателю, то отхватит UB.

Эффект, когда после освобождения участка памяти ее содержимое меняется можно наблюдать только в режиме отладки. Это делается специально, чтобы было легче обнаруживать повторное обращение к освобожденным участкам по висячим указателям. Но опять же на состоянии вашего указателя это затирание данных освобожденной области никак не вляет. Указатель по-прежнему помнит адрес куда он указывает.

Из-за того, что кто-то сделает у вас в квартире уборку, место регистрации в вашем паспорте не поменяется.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878665
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После delete объекта уже нет, он уничтожен, т.е. после указатель не должен использоваться.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878666
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumв приведенной цитате ничего не сказано что там что-то меняется.Что Вы имеете в виду? Что в ней нет буквально слова однокоренного "modify"?
CerebrumТам сказано, что освобожденная область, на которую смотрел указатель для него становится невалидной .Там сказано, что значения всех указателей, которые представляли (represent) адрес из освобождённого куска, становятся невалидными значениями указателей . Про то, что память становится невалидной, ничего не сказано. Такого термина как "невалидная память" я даже не встречал в стандарте. (В отличие от термина "invalid pointer value").
CerebrumЭффект, когда после освобождения участка памяти ее содержимое меняется можно наблюдать только в режиме отладки.При чём тут содержимое?
CerebrumУказатель по-прежнему помнит адрес куда он указывает.Нет, invalid pointer value не представляет (represents) никакого адреса.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878670
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisCerebrumв приведенной цитате ничего не сказано что там что-то меняется.Что Вы имеете в виду? Что в ней нет буквально слова однокоренного "modify"?
CerebrumТам сказано, что освобожденная область, на которую смотрел указатель для него становится невалидной .Там сказано, что значения всех указателей, которые представляли (represent) адрес из освобождённого куска, становятся невалидными значениями указателей . Про то, что память становится невалидной, ничего не сказано. Такого термина как "невалидная память" я даже не встречал в стандарте. (В отличие от термина "invalid pointer value").
CerebrumЭффект, когда после освобождения участка памяти ее содержимое меняется можно наблюдать только в режиме отладки.При чём тут содержимое?
CerebrumУказатель по-прежнему помнит адрес куда он указывает.Нет, invalid pointer value не представляет (represents) никакого адреса.

В данном случае указатели становятся невалидными не от того, что адрес, в них содержащий, изменился. А от того, что адресат переехал (или умер).
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878680
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis,

К словам можно придираться сколько угодно, я попытался донести смысл происходящего.

К примеру, у вас есть указатель:

int* pInt = new int;

после выполнения операции менеджер память вернет в pInt адрес (в адресном пространстве процесса), где лежат 4 байта представляющие значение типа int.

Предположим, что pInt равен 0x12345678.
После освобождения памяти

delete pInt;

должны ли мы рассчитывать, что содержимое этих 4 байт измениться?

Все зависит от того, как реализован менеджер памяти и как он поведет себя известно только его создателям. Возможно он пометит участок освобожденной памяти 0-байтами или каким-то другим символом заполнителем.
А возможно вообще ничего не будет делать потому что это неэффективно затирать десятки байт, каждый раз как кто-то освобождает память.

Единственное на что мы можем рассчитывать что менеджер памяти запишет себе: участок в 4 байта по адресу 0x12345678 свободен.

Значит ли это что если менеджер памяти пометит эту область как свободную это как-то повлияет на pInt и адрес который тот представляет?

Абсолютно нет!
pInt по-прежнему будет равен 0x12345678, только содержимое по данному адресу уже не будет представлять собой int, который мы выделяли, Это уже будут "чужие" данные, вне зависимости что с ними сделает менеджер памяти. Возможно в следующем вызове new он снова вернет этот же адрес но уже другому объекту.

Если бы после освобождения блока памяти по delete, компилятор обязан был бы изменять адрес указателя, который он когда-то вернул, то pInt автоматически обнулялся или изменялся каким-то волшебным образом, и никаких висячих указателей как явления не существовало бы.

В чем смысл чтения стандарта, кроме буквоедства?
Читайте лучше документацию на компилятор, которым вы пользуетесь и/или менеджер памяти.
Насколько мне известно ни один компилятор не соответствуют на 100% стандарту языка и стандарт этого не требует.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878699
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumК словам можно придираться сколько угодноИменно, что не стоит придираться к словам, мол, "не написано что меняется". Если значение было указателя было одно ( pointer to an int object), а стало другим (invalid pointer value), то оно поменялось .
CerebrumВ чем смысл чтения стандарта, кроме буквоедства?
Читайте лучше документацию на компилятор, которым вы пользуетесь и/или менеджер памяти.Давайте я сам решу что мне лучше читать :D
CerebrumНасколько мне известно ни один компилятор не соответствуют на 100% стандарту языкаВпечатлён Вашими познаниями.
Но вообще мне интересен ответ на мой вопрос, а не какие-то пространные рассуждения о менеджерах памяти и советы что мне лучше делать.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878701
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisCerebrumК словам можно придираться сколько угодноИменно, что не стоит придираться к словам, мол, "не написано что меняется". Если значение было указателя было одно ( pointer to an int object), а стало другим (invalid pointer value), то оно поменялось .
...
Значение указателя не поменялось. Изменился объект, на который он указывает.
...
ЗЫ: да, твою модель мира тебе придется менять.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878704
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёИзменился объект, на который он указывает.Это где такое сказано?
ёёёёёЗЫ: да, твою модель мира тебе придется менять.Ну или тебе твою :D
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878705
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis,

вернее, он может измениться, но это зависит от, например, диспетчера памяти.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878709
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёZ axis,

вернее, он может измениться, но это зависит от, например, диспетчера памяти.
Ну вот, такой код в MS VS 2017

Код: plaintext
1.
2.
3.
4.
	int*  ptr = new int;
	std::cout << int64_t(ptr) << std::endl;
	delete ptr;
	std::cout << int64_t(ptr) << std::endl;


дает вывод

Код: powershell
1.
2.
6113712
33059



... а в gcc

Код: powershell
1.
2.
5470288
5470288



Такие дела.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878711
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё, не оффтопь
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878716
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisёёёёё, не оффтопь
В msvs переводят конкретный указатель в область памяти ниже 2^16, обращение к которой вызовет гарантированный эксцепшн.
Но вот тут:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	int* const ptr = new int;
	int* const ptr2 = ptr;
	std::cout << int64_t(ptr)<<"   " << int64_t(ptr2) << std::endl;
	delete ptr; // Здесь и ptr и ptr2 - "invalid pointer", хотя, естественно, диспетчер сбросил только ptr2
	std::cout << int64_t(ptr) << "   " << int64_t(ptr2) << std::endl;

	delete ptr2; // тут уже будет непредсказуемая "Ж"
	delete ptr; // тут же будет предсказуемый экцепшн, но только в данном компиляторе


- вывод:
Код: powershell
1.
2.
3623344   3623344
33059   3623344


уже ничего не спасает, ясное дело, ptr2 все равно смотрит туда же, куда и раньше и после del:
А в gcc оба указателя после del не поменяются, но тоже станут "Инвалид поинтер".
...
Непонятно, чего ты добиваешься. "Инвалид поинтер" - это не значение, это состояние.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878718
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёА в gcc оба указателя после del не поменяются, но тоже станут "Инвалид поинтер".Выбери что-то одно. Либо "не поменяются", либо "станут инвалид поинтер".
ёёёёё"Инвалид поинтер" - это не значение, это состояние.[basic.compound]/3 с этим не согласен.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878720
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisёёёёёА в gcc оба указателя после del не поменяются, но тоже станут "Инвалид поинтер".Выбери что-то одно. Либо "не поменяются", либо "станут инвалид поинтер"...

Все уже обсудили, глупо троллить пытаешься.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878723
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёВсе уже обсудили, глупо троллить пытаешься.Троллишь пока тут только ты, утверждая, что invalid pointer value это не значение.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878724
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisёёёёёВсе уже обсудили, глупо троллить пытаешься.Троллишь пока тут только ты, утверждая, что invalid pointer value это не значение.
Ну и чему же оно равно в gcc?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878728
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёZ axisпропущено...
Троллишь пока тут только ты, утверждая, что invalid pointer value это не значение.
Ну и чему же оно равно в gcc?К чему этот твой вопрос? Что значит "равно"? Оператор сравнения (==) сравнивает указатели не по значению.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878735
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisТроллишь пока тут только ты, утверждая, что invalid pointer value это не значение.

Кода ты постареешь и достигнешь возраста 45 лет, твой паспорт станет недействительным.
Изменится ли он при этом?

"Недействительный" это не значение, а состояние. Как тебе и сказали уже два раза.
Указатель недействителен поскольку он указывает на несуществующий кусок памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisКак известно, при освобождении памяти значения всех указателей меняются:

Нет такого контракта.

Указатель это просто целое число. В этом вся суть адресной арифметики С++.
Обязанность программиста С++ - помнить об этом и не использовать разыменование
указателя после того как он удалён через delete ptr.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878740
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКода ты постареешь и достигнешь возраста 45 лет, твой паспорт станет недействительным.
Изменится ли он при этом?«Аналогии сосут» ©
Dimitry Sibiryakov"Недействительный" это не значение, а состояние. Как тебе и сказали уже два раза. Ты считаешь что двух раз достаточно чтобы нечто не согласующееся со стандартом стало согласовываться с ним (или стало более верным, чем стандарт)?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878741
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУказатель это просто целое число.Нет.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878742
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забаненный чувак специально зарегился, чтобы потроллить?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878743
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonУказатель это просто целое число.Нет.
Интересный диалог получается.

Кстати если ты не заметил - то ты сюда пришёл с вопросом. А тон взял - менторский. Нехорошо это. Улавливаешь?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878745
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНет такого контракта.

Хуже того, в операторе delete (и вообще delete) операнд вроде как не обязан быть lvalue.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878747
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZ axisпропущено...
Нет.
Интересный диалог получается.

Кстати если ты не заметил - то ты сюда пришёл с вопросом, а сюда понабежали тролли с какой-то чушью типа "invalid pointer value это не значение, а состояние" или "указатель это просто число", вместо того, чтобы на вопрос отвечать.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878748
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovmaytonНет такого контракта.

Хуже того, в операторе delete (и вообще delete) операнд вроде как не обязан быть lvalue.
А это тут при чём?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878753
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisа сюда понабежали тролли с какой-то чушью типа "invalid pointer value это не
значение, а состояние" или "указатель это просто число", вместо того, чтобы на вопрос
отвечать.
Этои есть ответ на вопрос. Из стандарта надо не одну строку выдирать, но и определение
понятия на которое она ссылается.

Z axisА это тут при чём?

При всём. Так любимый тобой стандарт языка запрещает изменять rvalue.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878755
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предвосхищая безсмысленный не-технический а гуманитарный спор, я считаю нужным закрыть этот топик.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878757
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
int main()
{
   int* const ptr = new int{};
   delete ptr;
}

Как известно, при освобождении памяти значения всех указателей меняются:
basic.stc/4When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.
Но менять значения константных объектов нельзя (приводит к неопределённому поведению):
dcl.type.cv/4Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.
Получается, строка `delete ptr;` приводит к неопределённому поведению, т.к. (косвенно) меняет значение константного объекта?
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878758
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovZ axisа сюда понабежали тролли с какой-то чушью типа "invalid pointer value это не
значение, а состояние" или "указатель это просто число", вместо того, чтобы на вопрос
отвечать.
Этои есть ответ на вопрос. Из стандарта надо не одну строку выдирать, но и определение
понятия на которое она ссылается.Принесёшь определение invalid pointer value не как значения, а как состояния?

Dimitry SibiryakovZ axisА это тут при чём?

При всём. Так любимый тобой стандарт языка запрещает изменять rvalue.Ты читал цитату из [basic.stc]/4 в первом посте? Там сказано «the values of all pointers». Про аргумент или не аргумент delete ничего не сказано.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39878767
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisДопустим, есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
int main()
{
   int* const ptr = new int{};
   delete ptr;
}

Как известно, при освобождении памяти значения всех указателей меняются:
basic.stc/4When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.
Ты не правильно переводишь. Здесь не говорится об изменении указателей.

Z axisНо менять значения константных объектов нельзя (приводит к неопределённому поведению):
dcl.type.cv/4Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.
Получается, строка `delete ptr;` приводит к неопределённому поведению, т.к. (косвенно) меняет значение константного объекта?[/quot]Это тоже не верный перевод. Ты путаешь константу с указателем.

В общем, возьми русский вариант спецификации или русский вариант учебника.

И не надо переоткрывать закрытые топики. Не надо.
...
Рейтинг: 0 / 0
C++17 и константные указатели на динамическую память
    #39879130
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisДопустим, есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
int main()
{
   int* const ptr = new int{};
   delete ptr;
}





Этот код вообще-то абсолютно валидный код.
Ты можешь создать константный объект и удалить его потом.
Если бы это было невозможно, то ты бы не мог создавать константные объекты динамически вообще.


Z axisКак известно, при освобождении памяти значения всех указателей меняются:
basic.stc/4When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.Но менять значения константных объектов нельзя (приводит к неопределённому поведению):


Это всё к данному случаю не относится.

Z axisdcl.type.cv/4Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.
Получается, строка `delete ptr;` приводит к неопределённому поведению, т.к. (косвенно) меняет значение константного объекта?

Тут его нет.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++17 и константные указатели на динамическую память
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]