На что будет указывать указатель на объект за пределами области видимости объекта в Переполнении стека

class Foo{
private:
int i;
public:
Foo(int a)
{
i = a;
}

int getI() {return i;}
};

int main()
{
Foo* f;
if(true)
{
Foo g(1);
f = &g;
}

cout << f->getI() << endl;
return 0;
}

В приведенном выше коде данный объект класса Foo выйдет из области видимости после выхода из условия if. Так, когда оператор cout выполнен, это будет печатать 1?

0

Решение

Объект будет уничтожен, вызвав деструктор объекта.

Указатель по-прежнему будет указывать на ту же ячейку памяти.

Доступ к нему — неопределенное поведение, поэтому он может делать что угодно.


Вы не можете принять такое поведение, но если ваш код содержит только этот код, то есть вероятность, что он будет эффективно печатать 1, так как память не будет перезаписана.

Но не думайте, что это будет так!

1

Другие решения

Поведение не определено. Это может сделать что угодно. Вы должны абсолютно избегать неопределенного поведения.

4

Это вызовет неопределенное поведение. Юридически он может делать все что угодно: он может напечатать 1, он может напечатать 42, он может заказать пиццу или он может закончить всю жизнь во вселенной. Все законные результаты. Неопределенное поведение очень плохой.

однажды g выходит за рамки, это больше не определяется, f теперь указывает на неопределенный объект и разыменование f, хотя и не запрещено, никоим образом не поддерживается.

3

Вы получаете Неопределенное поведение. Вы не можете знать, что Cout будет печатать …

Может быть, иногда он будет печатать правильное значение, но вы можете быть уверены, что в день демонстрации это не будет правильным …

0

Это может. Или не может. Объект будет уничтожен, указатель укажет на тот же адрес в памяти.

Но разыменование этого указателя неопределенное поведение, и это не то, что вы хотите. Действительно, какая польза от программы, которую никто не может сказать, что она будет делать?

0
По вопросам рекламы [email protected]