2015-04-16 2 views
0

Пусть ниже код,Занимает ли iostream пространство стека?

int* foo(){ 
    int a=5; 
    return &a; 
} 
int main(){ 
    int* b=foo(); 
    std::cout<<*b<<std::endl; 
    return 0; 
} 

Мое понимание этой программы заключается в том, что время жизни только в обув. По завершении foo() значение не должно быть действительным. Но поскольку никакая функция не перезаписывает этот кусок стека, он все равно печатает 5. Пожалуйста, исправьте меня, если это не так.

Если вышесказанное верно, мой вопрос в том, что я вызвал std :: cout < <, выходной поток; Я на самом деле что-то назвал, займет ли место в стеке? Или как это работает в памяти. Большое спасибо!!

+1

Ваш вопрос касается 'a', а не' iostream.' – EJP

+0

Компилятор, возможно, даже не хочет возвращать '& a', так как это непривычно. Это может показаться противоречивым. В конце концов, вы его записали. Но многие компиляторы C++ _optimize_ результирующие двоичные файлы, удаляя утверждения, которые не вносят вклад в правильный результат. Такие оптимизаторы не являются волшебными, им нужны правила для определения того, какие утверждения безопасны для удаления. И эти правила могут иметь довольно неожиданные результаты в таких сломанных программах. – MSalters

ответ

2

«Но поскольку никакая функция не перезаписывает этот кусок стека». Вы этого не знаете точно: в стандарте C++ нет ничего такого. Я мог бы построить совместимый со стандартами компилятор, который перезаписывает этот кусок стека. Возможно, моя реализация std::cout сделает это.

Формальное поведение вашей программы: undefined. Вы не можете больше говорить.

Смежные вопросы