1
int n = 0;
// первый способ размещения символа по адресу
char* pch = reinterpret_cast<char*>(&n);
*pch = 'a';

// второй способ
char* pnew = new (&n)char('a');

// проверка
if (pch == pnew)
   cout  << n;

Объясните, пожалуйста, разницу между размещениями первым и вторым способом. Если ее нет, то тогда для чего нужно существование reinterpret_cast?

Harry
  • 221,325
AR Hovsepyan
  • 15,934
  • 5
    Первое — undefined behavior, второе, думаю, тоже. Разницы нет, и то, и другое неправильно. – VladD Jan 05 '18 at 00:04
  • тогда не понимаю для чего нужен был вообше reinterpret_cast ? Пусть использовали бы new и static_cast?.. – AR Hovsepyan Jan 05 '18 at 00:23
  • 3
    А вот это хорошая тема для отдельного вопроса, думаю. – VladD Jan 05 '18 at 00:29
  • VladD, добавил, давай поговорим?... – AR Hovsepyan Jan 05 '18 at 00:36
  • Я думаю, имеет смысл вопрос о reinterpret_cast задать отдельно. (И я сам не большой спец в C++, пусть специалисты лучше ответят.) – VladD Jan 05 '18 at 00:40
  • 2
    Отдельный вопрос, пожалуйся, не просто добавление к этому вопросу. – MarianD Jan 05 '18 at 00:43
  • я недавно в сайте, поэтому просвятите меня, какая разница вопросы задаются отдельно или нет? Я же просто хочу получить ответ на вопрос, который у меня возник. Обьясните, чтоб я понел и впредь делал так как нужно – AR Hovsepyan Jan 05 '18 at 00:46
  • и думаю кому то не лень ставить минусы, какбудто для него это компьютерная игра Когда голосуете, то обьясните что вы _ многоуважаемый эксперт нашли в вопросе такого, что не дает вас просто просмотреть другие. Особенно если не вашего ума дело отвечать на такой вопрос – AR Hovsepyan Jan 05 '18 at 02:04
  • lдело не в том нравится мне он или нет - лично мне они вообше пока не понадобились, а дело в простом желании знать. То что это нужно делать только при крайной необходимости и тщательно скрыть, это все понятно.. Еще раз прочитайте суть моего вопроса – AR Hovsepyan Jan 05 '18 at 02:11
  • кстати union использовать тоже не советуется...но вы просто не понимаете вопрос или не знаете ответа – AR Hovsepyan Jan 05 '18 at 02:16
  • отвечают, потом удаляют свой ответ, ставят минусы и уходят _ и тут показываем свою дисциплину... – AR Hovsepyan Jan 05 '18 at 02:25
  • 2
    @VladD, можете пояснить почему первое UB? Насколько мне известно, к памяти можно обращаться через char* – yrHeTateJlb Jan 05 '18 at 06:07
  • 1
    Вопрос о смысле существования reinterpret_cast уже есть. – wololo Jan 05 '18 at 09:38
  • 1
    @yrHeTaTeJlb: Хм, и правда. Наверное, всё же первое — не UB. Я забыл, что char* — особый. – VladD Jan 05 '18 at 09:50

1 Answers1

3

Сразу: не буду говорить об UB - откровенно говоря, не вижу (особенно в вашем случае, для char) для него причин... но это одно из моих слабых мест. Самому будет интересно выcлушать, почему здесь UB. Если из-за strict aliasing - то вроде как раз через char* разрешено обращение...

Как человек более практический :), скажу, что основное отличие будет проявляться тогда, когда это будут не POD, а какие-то более интересные случаи - например, объекты класса. Пример, кусочки из которого здесь, полностью лежит по адресу https://ideone.com/RvQSax

В первом случае мы имеем присваивание, и вызывается именно оператор присваивания:

long long L;
Test * t = reinterpret_cast<Test*>(&L);
*t = Test(5);

Главная беда в том, что присваивание выполняется просто месту в памяти, так что если оператор присваивания будет заниматься сначала удалением объекта, которому присваиваем - мы таки получим неприятностей... А если там лежал таки объект с нетривиальным деструктором - то проблем будет еще больше.

long long M;
Test * u = new(&M) Test(6);

Этот способ куда корректнее - потому что размещающий оператор new предполагает наличие неинициализированной памяти, в которой с помощью конструктора нужно разместить объект (ну, как если бы память была выделена). Никаких действий с якобы размещенным до этого в этой памяти объектом не производится.
Но! Все равно остается старая проблема - если там реально был объект с нетривиальным деструктором - то будут проблемы.

P.S. Может, @VladD имел в виду именно это, говоря об UB?

Harry
  • 221,325
  • 1
    Ага, я забыл об особой роли char*. – VladD Jan 05 '18 at 10:16
  • Harry и VladD, вы как всегда отвечаете корректно и ясно, Приятно, что есть такие пользователи – AR Hovsepyan Jan 05 '18 at 12:10