Информация об изменениях

Сообщение Re: Безопасно ли присваивать один указатель другому?.. от 22.03.2018 18:48

Изменено 22.03.2018 20:55 AlexGin

Re: Безопасно ли присваивать один указатель другому?..
Здравствуйте, okman, Вы писали:

O>Как думаете, возможно ли в C или C++ получить какой-нибудь побочный эффект во время

O>присваивания одного указателя другому? Т.е., упрощенно говоря, может ли программа упасть
O>на выполнении простой конструкции типа x = y? Считаем, что x и y — это самые обычные
O>"сырые" указатели, т.е. не смарт-поинтеры, не классы с переопределенным оператором
O>присваивания и ничего такого, а просто самые обычные указатели:

O>
O>SomeType * x;
O>AnotherType * y;

O>//
O>// здесь много разного кода.
O>// x и y присваиваются всякие значения,
O>//    а может и не присваиваются...
O>//

O>x = y;
O>

O>Или такое присваивание всегда безопасно, даже если сами указатели содержат null или "мусор"?

Здесь главный вопрос:
Как саязаны между собой SomeType и AnotherType
Если это совершенно разные типы (никак не связянные наследованием) — то это ИМХО не безопасно

В общем, я бы сделал так:
if (dynamic_cast<SomeType*>(y))
{
   x = y;
}
Re: Безопасно ли присваивать один указатель другому?..
Здравствуйте, okman, Вы писали:

O>Как думаете, возможно ли в C или C++ получить какой-нибудь побочный эффект во время

O>присваивания одного указателя другому? Т.е., упрощенно говоря, может ли программа упасть
O>на выполнении простой конструкции типа x = y? Считаем, что x и y — это самые обычные
O>"сырые" указатели, т.е. не смарт-поинтеры, не классы с переопределенным оператором
O>присваивания и ничего такого, а просто самые обычные указатели:

O>
O>SomeType * x;
O>AnotherType * y;

O>//
O>// здесь много разного кода.
O>// x и y присваиваются всякие значения,
O>//    а может и не присваиваются...
O>//

O>x = y;
O>

O>Или такое присваивание всегда безопасно, даже если сами указатели содержат null или "мусор"?

Здесь главный вопрос:
Как связаны между собой SomeType и AnotherType???
Если это совершенно разные типы (никак не связянные наследованием) — то это ИМХО не безопасно

В общем, я бы сделал так:
if (dynamic_cast<SomeType*>(y))
{
   x = y;
}