На стековую память ссылается динамически распределяемая переменная-член объекта - PullRequest
3 голосов
/ 14 октября 2010

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

class Test
{
public:
    int &ref;
    int a;

    Test(int &x)
        :ref(x)
    {
        cout<<"Address of reference "<<&ref<<endl;
        cout<<"&a : "<<&a<<endl;
        cout<<"this = "<<this<<endl;
    }
};

int main()
{
    Test *pObj = NULL;
    {
        int i = 10;
        cout<<"Address of referent "<<&i<<endl;
        pObj = new Test(i);
    }
    pObj->ref++;
    cout<<pObj->ref;
}

Вывод:

Address of referent 002DFB3C

Address of reference 002DFB3C

&a : 00734C94

this = 00734C90

Как видите, тестовый объект создается динамически. переменная i, которая хранится в стеке, отправляется в качестве параметра конструктору класса Test. Я напечатал адрес переменных i, ref и a.

Вопрос: переменная i будет уничтожена, когда управление программой выйдет из блока, в котором она объявлена. Но переменная-член динамически размещаемого объекта ref все равно будет ссылаться на адрес стека (Address of i). Можно использовать ref после смерти я.

Почему объект кучи имеет ссылку на память стека? Почему это разрешено?

1 Ответ

8 голосов
/ 14 октября 2010

Почему [куча] объекта имеет ссылку на память стека?

Поскольку вы передали локальную переменную i по ссылке в конструктор объекта Test, который вы создали динамически, конструктор сохранил эту ссылку.

Почему это разрешено?

В C ++ вы, программист, несете ответственность за то, чтобы любые используемые вами указатели указывали на допустимые объекты.В языке нет никаких средств защиты, чтобы «защитить» вас от таких глупостей (конечно, существуют хорошие практики программирования, которые помогут вам гарантировать, что у написанного вами кода не должно быть подобных проблем).

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

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