Здравствуйте, Аноним, Вы писали:
А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?
А потому что не определенное поведение. Может работать, а может и нет.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, , Вы писали:
> void F ( int** vp ) > { > int li = 10 ; > *vp = &li ; > } > > int main(int argc, char* argv[]) > { > using namespace std ; > int *lp = NULL ; > F ( &lp ) ; > > cout<<"["<<*lp<<"]"<<endl ; > > return 0; > } > > Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает > на уже мертвый объект?
Это как же оно тебе узнает, что твой объект — мертвый? Есть какой-то адрес, из него и берет данные. Стек у тебя просто еще не затерся. Вставь перед твоим cout
printf("", 0, 0, 0, 0, 0);
и посмотри, что получится...
-- Всего хорошего!
-- Alex Alexandrov, e-mail: alexandrov_alex@fromru.com
Posted via RSDN NNTP Server 1.7 beta
It's kind of fun to do the impossible (Walt Disney)
А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?
Что значит "работает"? Не падает? Или показывает правильное значение? Если первое — то все логично, т. к. lp указывает на область стека, которая доступна для чтения. А если второе — то повезло.
Не умножай количества сущностей сверх необходимого
Здравствуйте, Vamp, Вы писали:
V> Потому, что в С/С++ нет счетчика ссылок и сборщиков мусора.
Пардон, если бы было то, о чем вы говорите, то его программа тем более бы работала. Это она не работать может потому, что ссылки не отслеживаются.
-- Всего хорошего!
-- Alex Alexandrov, e-mail: alexandrov_alex@fromru.com
Posted via RSDN NNTP Server 1.7 beta
It's kind of fun to do the impossible (Walt Disney)
Это вроде как шутка была.
Правильный ответ:
В отличии от языков со встроенными механизмами управления памяти, с С/С++ использование этих механизмов остается целиком на совести программиста. В результате программа будет жизнерадостно работать с памятью, указывающей черт знает куда, пока не получит сегментейшн фолт или ассес виолейшн.
Здравствуйте, Аноним, Вы писали:
А>void F ( int** vp ) А>{ А> int li = 10 ; А> *vp = &li ; А>}
А>int main(int argc, char* argv[]) А>{ А> using namespace std ; А> int *lp = NULL ; А> F ( &lp ) ;
А> cout<<"["<<*lp<<"]"<<endl ;
А> return 0; А>}
А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?
Всё очень просто данные после выхода за область видимости не затираются специально, то есть в памяти (стеке) они всё равно остаются а так как стек принадлежит твоему процессу то и ошибка доступа к памяти не происходит, однака не факт что этот код всегда будет выдавать правильный результат, скорее результат надо считать не опраделённым и то что он получается правильным чистая случайность, так как если ты запишешь чего нибудь в стек поверх то результат будет другим, а в стек ты запишешь при первом же вызове любой функции.