0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
1

Особенность указателей

12.07.2020, 18:24. Показов 3726. Ответов 66
Метки нет (Все метки)

Всем привет, есть вот такой код:
C++
1
2
3
4
5
6
7
8
        
char* s1 = new char[5];
strcpy_s(s1, 5, "some");
char* s2 = s1;
delete s1;
if (s1 == s2) {
    cout << "true ???" << endl;
}
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2020, 18:24
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

66
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 18:41 2
Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
s1 после delete не изменится. Просто удалится его содержимое.
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
12.07.2020, 18:54  [ТС] 3
oleg-m1973, s1 - адрес в памяти на 1 элемент массива, после delete сразу же "затирается" значение ? или ос помечает что адрес s1 свободен для записи и не понятно, когда изменится ?
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 19:00 4
Цитата Сообщение от alaksion Посмотреть сообщение
или ос помечает что адрес s1 свободен для записи и не понятно, когда изменится ?
Да, примерно так. Содержимое памяти, на которое указывает s1 не изменится, пока туда кто-нибудь что-нибудь не запишет.
Только не путай указатель и содержимое указателя. У тебя (s1 == s2) всегда будет true, а вот (*s1 == *s2) не всегда.
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
12.07.2020, 19:18  [ТС] 5
oleg-m1973, Теперь я окончательно запутался. Как можно проверять что по указателю произвели delete ?
К примеру есть 2 массива: 1) Указателей 2) списков из этих указателей
Идея была удалять элемент из первого массива и в будущем делать проверку на delete во втором
Миниатюры
Особенность указателей  
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 19:24 6
Лучший ответ Сообщение было отмечено alaksion как решение

Решение

Цитата Сообщение от alaksion Посмотреть сообщение
oleg-m1973, Теперь я окончательно запутался. Как можно проверять что по указателю произвели delete ?
Правильно, нельзя. Но, так ты задал вопрос.

Цитата Сообщение от alaksion Посмотреть сообщение
Идея была удалять элемент из первого массива и в будущем делать проверку на delete во втором
Так не получится. Надо использовать std::shared_ptr/std::weak_ptr
1
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
12.07.2020, 19:36 7
Цитата Сообщение от alaksion Посмотреть сообщение
после delete сразу же "затирается" значение ?
Нет. Просто сразу после delete любое обращение к разыменованному указателю может привести к вылету программы. Не всегда, и с некоторой вероятностью, но суть остаётся. Ровно то же самое относится и к обращению s1[5] или s1[6] до delete (оно может как пройти незамеченным при отладке, так и вызывать вылет).

А вот сами адреса в указателях ничего сравнивать не мешает, вне зависимости от того, на какую область памяти эти адреса указывают. if (s1 == s2) можешь делать когда угодно. Вот только тебе не это нужно для сравнения строк, содержащихся по адресам в указателях. Гугли strcmp и strcpy

Добавлено через 3 минуты
Цитата Сообщение от alaksion Посмотреть сообщение
или ос помечает что адрес s1 свободен для записи и не понятно
помечает, что твоя программа больше не может пользоваться памятью по этому адресу, а могут пользоваться другие программы. Содержимое памяти при этом может или никак не меняться, или потом измениться другими программами.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 05:13 8
Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится
Да, причём значение изменится и у s1, и у s2:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.stc#4
When 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.
---
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
s1 после delete не изменится
И это неправильный ответ.
Цитата Сообщение от TRam_ Посмотреть сообщение
А вот сами адреса в указателях ничего сравнивать не мешает
Ну-ну.
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 10:52 9
Цитата Сообщение от argcargv Посмотреть сообщение
И это неправильный ответ.
Да? И в чём же его "неправильность"?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:29 10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И в чём же его "неправильность"?
Кого — его?
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 11:38 11
Цитата Сообщение от argcargv Посмотреть сообщение
И вот думаешь, то ли правда настолько читать не умеют, то ли это хуцпа такая особенная: спрашивать, в чём неправильность сразу после достаточно подробного пояснения — в чём.
Ты своё что-ли "пояснение" называешь подробным? Которое "ну-ну"?
Ты хотя бы различаешь, что такое значение указателя и что такое содержимое памяти, на которую он указывает?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:43 12
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты своё что-ли "пояснение" называешь подробным? Которое "ну-ну"?
Выше "---" глаза не поднимаются?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты хотя бы различаешь, что такое значение указателя и что такое содержимое памяти, на которую он указывает?
Да, а ты?
0
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
13.07.2020, 11:46 13
Цитата Сообщение от argcargv Посмотреть сообщение
become invalid pointer values
Значения получат статус "полученные по недопустимому указателю".
Но это вообще никак не определяет, какими именно они будут. Нет, если используется отладочная куча, то new/delete будут заполнят память специальными значениями ( https://docs.microsoft.com/en-... ew=vs-2019 ) но в случае выключения всего этого значения в памяти не будут меняться при освобождении - это очень нерационально в плане производительности.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 11:46 14
Лучший ответ Сообщение было отмечено alaksion как решение

Решение

Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
гарантируется, что оно не изменится

значение переменной s1 - адрес объекта.
объект был удален, и значит его адрес уже не валидный.

однако указатель об этом не знает ничего не знает.
он по прежнему содержит тот же самый адрес уже убитого объекта.

Цитата Сообщение от alaksion Посмотреть сообщение
Как можно проверять что по указателю произвели delete ?
в общем случае - никак.

в частных случаях делаешь так:

C++
1
2
delete ptr;
ptr = nullptr;
присваиваешь указателю нуль.
доступ по указателю:

C++
1
2
if(ptr)
    ptr->work();
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:51 15
Цитата Сообщение от TRam_ Посмотреть сообщение
become invalid pointer values
Цитата Сообщение от TRam_ Посмотреть сообщение
Значения получат статус "полученные по недопустимому указателю".
Ну это вообще пушка.

Цитата Сообщение от hoggy Посмотреть сообщение
гарантируется, что оно не изменится
В каком месте?
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
13.07.2020, 11:51  [ТС] 16
Проверил на большом массиве, пикрилл выполнялся всегда. Вот мне и стало интересно, зависит ли код от ОС / компилятора
Миниатюры
Особенность указателей  
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:54 17
Цитата Сообщение от alaksion Посмотреть сообщение
Вот мне и стало интересно, зависит ли код от ОС / компилятора
Можно сказать что поведение твоего кода зависит от реализации. Вот весь параграф [basic.stc]/4:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.stc#4
When 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. Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior. Any other use of an invalid pointer value has implementation-defined behavior.37

37) Some implementations might define that copying an invalid pointer value causes a system-generated runtime fault.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 11:57 18
Цитата Сообщение от argcargv Посмотреть сообщение
В каком месте?
в стандартном.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:58 19
Цитата Сообщение от hoggy Посмотреть сообщение
в стандартном.
Это ты так теперь свой "здраый смысл" называешь? Стандартным местом.
0
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
13.07.2020, 11:59 20
alaksion, так ты можешь сравнивать указатели вообще с какими угодно значениями. Да хоть даже так:

C++
1
2
3
char* s1 = 0x1234;
char* s2 = 0x4321;
cout << (s1==s2)<<endl;
и это будет абсолютно корректно с точки зрения синтаксиса и исполнения.

Добавлено через 53 секунды
Но я почти абсолютно уверен, что тебе не то сравнение нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 11:59
Помогаю со студенческими работами здесь

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор...

Особенность циклов в c++
Здравствуйте , я новичек в программировании, поэтому могу чего-то не знать. Сегодня я заметил...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

Особенность объявления функции
Собсно вопрос такой , зачем нужно объявлять функции если их можно просто определять? связано ли это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru