области видимости и указатели c ++ - PullRequest
5 голосов
/ 09 января 2012

У меня есть следующий код:

using namespace std;
vector<string*> v;
{
  string s = "hello";
  v.push_back(&s);
}
{
  string ss = "goodbye";
  v.push_back(&ss);
}

cout << v.at(0)->c_str() << endl;
cout << v.at(1)->c_str() << endl;

, который печатает

goodbye
goodbye

, если я уберу скобку области видимости, код напечатает

hello
goodbye

Что именнопроисходит, когда я покидаю первую область видимости, указатель на первую строку теперь указывает на вторую?

Ответы [ 4 ]

7 голосов
/ 09 января 2012

Сохраненные указатели становятся висячими указателями после области и любая попытка прочитать то, на что они указывают, приводит к неопределенному поведению.

3 голосов
/ 09 января 2012

На практике система повторно использует память, которую она использовала для строки s для хранения строки ss. Но так получилось, как компилятор управляет памятью; в соответствии со стандартом C ++ на такое поведение нельзя полагаться, и фактический результат размещенного вами кода не определен.

3 голосов
/ 09 января 2012

В результате возникает неопределенное поведение, поскольку s находится вне области действия в тот момент, когда вы ссылаетесь на него при вызове оператора cout<<.

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

2 голосов
/ 09 января 2012

Вы разыменовываете два указателя на два разрушенных объекта: это неопределенное поведение.Здесь может произойти все что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...