общие данные между объектами через указатель в C ++ - PullRequest
0 голосов
/ 22 июня 2011

У меня есть несколько объектов, которые разделяют данные через указатель. Параметр указателя был отправлен через функции конструктора следующим образом.

class A
{
public:
    Shared* pB = new Shared();
    User* object1 = new User(pB);
    User* object2 = new User(pB);
}

class User
{
public:
    User(Shared* pB) {m_sharedB = pB};
private:
    Shared* m_sharedB;
}
class Shared
{
public:
    struct Account 
    {
        int account_number;
    }
    void method(){...};
}

Мой вопрос связан с функцией деструктора C ++. Что происходит с переменной-членом "m_sharedB", когда объект1 удаляется? Есть ли проблема с висящим указателем для других пиров?

Ответы [ 5 ]

6 голосов
/ 22 июня 2011

Если у вас есть класс, который содержит член, который является указателем,

class Foo
{
  Bar * mp_bar;
};

, то при уничтожении объекта Foo ничего не происходит, кроме этого указателя вместе с содержащим его объектом,выходит за рамки.Это то же самое, что происходит с p в конце следующей функции:

void bar()
{
  int * p;
}

Возможно, вы хотели спросить о том, «что происходит с объектом, на который указывает указатель».Это совершенно другой вопрос, и ответ «ничего».

(Поэтому, обычно, когда у вас есть класс, содержащий член-указатель, вы должны тщательно продумать, кому принадлежат какие-либо ресурсы, которые, возможно, потребуется очистить.)


Поскольку вы упомянули слово «деструктор» в своем вопросе, давайте разберемся раз и навсегда:

Объект типа указателя не имеет деструктора.Когда указатель выходит из области видимости, нет автоматического вызова delete.

0 голосов
/ 22 июня 2011

Звучит так, будто на ваш вопрос ответили, но я просто хотел упомянуть boost :: shared_ptr . Это может не соответствовать вашим текущим потребностям, но это полезные ситуации, подобные описанным выше.

0 голосов
/ 22 июня 2011

Что происходит с переменной-членом "m_sharedB", когда объект1 удаляется?

Когда объект1 удаляется, ничего не делается для указателя pB. Но переменная m_shared уничтожена. Также я хочу посоветовать вам использовать умные указатели из библиотеки Boost. Особенно shared_ptr

0 голосов
/ 22 июня 2011

Когда объект1 удаляется, память, на которую указывает m_sharedB, будет не освобождена, поскольку вы не предоставили деструктор для класса User.Это оставляет его на усмотрение содержащего класса (класса A), чтобы управлять временем жизни указателя Shared, а также удостовериться, что он должным образом удален, если больше нет ссылок на него (т. Е. Все пользовательские экземпляры, которые совместно используют один и тот же Shared указатель, являютсямертв).

0 голосов
/ 22 июня 2011

Уничтожение необработанной переменной-указателя - запрет ( читать дальше ). Общий объект по-прежнему будет доступен.

...