2016-12-18 3 views
1

Предположим, я создаю класс с именем MyClass, который содержит ссылочную переменную m_my_resource. Эта ссылочная переменная по существу является просто именованным псевдонимом, связанным с некоторой другой ячейкой памяти.Что происходит с ссылочной переменной, когда ее ссылка «умирает»?

MyClass

class MyClass 
{ 
    public:  
     MyClass(const MyResource& my_resource) : 
      m_my_resource(my_resource){} 

    private: 
     const MyResource& m_my_resource; 
} 

теперь позволяет сказать, что я пытаюсь сделать следующее:

main 
{ 
    MyClass my_class(utils::getMyResource()); 

    //continue doing stuff 
} 

Что именно происходит в этом случае? Я определил MyClass, чтобы иметь только один конструктор, который принимает ссылку (значение lvalue) до MyResource.

Однако в моей основной функции я создаю экземпляр MyClass с временным объектом (rvalue). Почему мой код способен скомпилировать? Не содержит my_class ссылочную переменную, связанную с некоторой временной ячейкой памяти? По существу переменная, в которой была связана эталонная переменная, теперь «умерла», что происходит с эталонной переменной?

Кроме того, это случай, когда я хочу, чтобы мой класс имел конструктор, который принимает ссылки rvalue?

+0

Связанный/обман: https://stackoverflow.com/questions/14735630/which-standard-wording-tells-us-that-ref-to-const-temporary-lifetime-extension-o Возможно, более конкретный, но обман первого: https: // stackoverflow.com/questions/30519148/life-of-tempor-pass-through-function-by-reference –

+1

Также * «Почему мой код способен скомпилировать?» * * * * код C++, который еще не компилируется. И последнее, но не менее важное: один вопрос на вопрос, пожалуйста. –

+0

@BaummitAugen Вопросы, на которые вы ссылаетесь, мне трудно понять. Возможно ли, чтобы экземпляр «MyClass» стал владельцем этого временного объекта? – Izzo

ответ

2

Почему мой код может быть скомпилирован?

Просто потому, что ваш код компилируется, не означает, что он будет работать правильно. В противном случае каждая программа в мире будет автоматически без ошибок, благодаря тому, что она успешно пройдет этап компиляции, и никому не понадобится научиться использовать отладчик.

Очевидно, что все не так.

Не содержит ли my_class ссылочную переменную, которая ассоциирована с с некоторой временной ячейкой памяти?

Да, это так.

По существу переменная, в которой ссылочная переменная была связана с теперь «умер», что происходит с эталонным переменной?

Ничего не происходит с вашей ссылочной переменной. Он все еще существует. Но ссылаясь на объект - тем самым он пытается попытаться вызвать его методы или получить доступ к своим членам - results in undefined behavior.

0

Если getMyResource() возвращает объект MyResource, где-то в getMyresource() вы выделяете память для объекта (в куче может быть), поэтому вам нужно освободить выделенную память. Например, вызовите деструктор MyResource для m_my_resource в деструкторе MyClass. Если вы этого не сделаете, у вас будет утечка памяти в вашей программе. В C++ нет сборщика мусора, чтобы освободить автоматически выделенную память, вы должны сделать это самостоятельно, но нет явной проблемы с компиляцией, просто выполняющей, если утечка памяти - это вопрос.

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