Мне показалось, что я неплохо справляюсь с C ++, оказывается, что нет. Предыдущий вопрос, который я задал: C ++ const lvalue ссылки имел следующий код в одном из ответов:
<code>
<code>#include <iostream></code>
using namespace std;</p>
<p>int& GenX(bool reset)
{
static int* x = new int;
*x = 100;
if (reset)
{
delete x;
x = new int;
*x = 200;
}
return *x;
}</p>
<p>class YStore
{
public:
YStore(int& x);
int& getX() { return my_x; }
private:
int& my_x;
};</p>
<p>YStore::YStore(int& x)
: my_x(x)
{
}</p>
<p>int main()
{
YStore Y(GenX(false));
cout << "X: " << Y.getX() << endl;
GenX(true); // side-effect in Y
cout << "X: " << Y.getX() << endl;
return 0;
}
Приведенный выше код выводит X: 100, X: 200. Я не понимаю почему.
Я немного поиграл с ним и добавил еще один вывод, а именно: cout перед удалением x; и клоут после нового х; в блоке управления сбросом.
То, что я получил, было:
перед удалением: 0x92ee018
после нового: 0x92ee018
Итак, я подумал, что static молча провалил обновление x, а второй getX проигрывал (после удаления) неинициализированную память; Чтобы проверить это, я добавил x = 0; после удаления, перед новым и другим cout, чтобы гарантировать, что x действительно был сброшен до 0. Это было.
Итак, что здесь происходит? Как получилось, что new возвращает тот же блок памяти, что и предыдущее удаление, предположительно free'd? Это только потому, что именно это решил сделать менеджер памяти ОС, или в статических функциях чего-то не хватает?
Спасибо!