Почему работает?????????
От: Аноним  
Дата: 22.08.03 10:29
Оценка:
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 указывает на уже мертвый объект?
Re: Почему работает?????????
От: Аноним  
Дата: 22.08.03 10:37
Оценка:
Так ты возьми, вызови какую-нибудь другую функцию, которая стек изменит заведя свои локальные переменные, что тогда будет?
Re: Почему работает?????????
От: WolfHound  
Дата: 22.08.03 10:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?

А потому что не определенное поведение. Может работать, а может и нет.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Почему работает?????????
От: alexandrov_alex США  
Дата: 22.08.03 10:41
Оценка:
Здравствуйте, , Вы писали:

> 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)
Re: Почему работает?????????
От: Vamp Россия  
Дата: 22.08.03 10:42
Оценка:
Потому, что в С/С++ нет счетчика ссылок и сборщиков мусора.
Да здравствует мыло душистое и веревка пушистая.
Re: Почему работает?????????
От: Flex Ferrum Россия  
Дата: 22.08.03 10:48
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?


Что значит "работает"? Не падает? Или показывает правильное значение? Если первое — то все логично, т. к. lp указывает на область стека, которая доступна для чтения. А если второе — то повезло.
Не умножай количества сущностей сверх необходимого
Re[2]: Почему работает?????????
От: alexandrov_alex США  
Дата: 22.08.03 10:49
Оценка:
Здравствуйте, 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)
Re[3]: Почему работает?????????
От: Vamp Россия  
Дата: 22.08.03 10:54
Оценка:
Это вроде как шутка была.
Правильный ответ:
В отличии от языков со встроенными механизмами управления памяти, с С/С++ использование этих механизмов остается целиком на совести программиста. В результате программа будет жизнерадостно работать с памятью, указывающей черт знает куда, пока не получит сегментейшн фолт или ассес виолейшн.
Да здравствует мыло душистое и веревка пушистая.
Re: Почему работает?????????
От: sypo Россия  
Дата: 22.08.03 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>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 указывает на уже мертвый объект?


Всё очень просто данные после выхода за область видимости не затираются специально, то есть в памяти (стеке) они всё равно остаются а так как стек принадлежит твоему процессу то и ошибка доступа к памяти не происходит, однака не факт что этот код всегда будет выдавать правильный результат, скорее результат надо считать не опраделённым и то что он получается правильным чистая случайность, так как если ты запишешь чего нибудь в стек поверх то результат будет другим, а в стек ты запишешь при первом же вызове любой функции.
Сергей.
Re: Почему работает?????????
От: DimRus Украина  
Дата: 23.08.03 18:28
Оценка:
Здравствуйте, Аноним, Вы писали:

...
А>Почему в VC 6 и VC 7 данный код работает, хотя, вроде бы, *lp указывает на уже мертвый объект?

Работает, потому что, хоть объект и "мертвый", но область памяти, в которой он находился, еще не занята ничем другим
Re: Почему работает?????????
От: Jesus Россия  
Дата: 25.08.03 07:04
Оценка:
Это работает потому что оператор вывода <<
определен для интегрального типа int.
А уже куда указывает этот разыменованный указатель не
имеет значения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.