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

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

Изменено 22.03.2018 21:23 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;
}


Вся проблема в том, что если SomeType и AnotherType никак не связаны между собой по иерархии классов, то само по себе присвоение указателя конечно же пройдет, но он будет указывать на объект СОВСЕМ другого типа (при дальнейшей работе с указателем "x" добро пожаловать в мир UB)...