Требуется ли деструктор для класса со структурой указателей - PullRequest
4 голосов
/ 23 июля 2011

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

struct group {
   void *v1, 
   void *v2;
};


class A {
  A (group& handle) 
  : m_handle(handle)
 private :
   group m_handle;
};

В классе A нет элементов указателя. Я не вижу проблем (таких как утечки памяти), когда деструктор не определен в A. Я узнал, что когда объект A выходит из области видимости, вызывается деструктор A и если в A есть классы-члены, то их деструкторы вызываются и так далее. Итак, что происходит с структурой-членом, как m_handle выше - есть ли у них что-нибудь похожее на деструктор и как два пустых указателя в группе структур удаляются, когда объект A выходит из области видимости?

Ответы [ 4 ]

4 голосов
/ 23 июля 2011

Да, v1 и v2 могут быть утечки, если они не освобождены в какой-либо другой части вашей программы. Итак, в деструкторе A вы можете удалить v1 и v2 (если это уместно), или вы можете просто добавить деструктор в группу (в c ++ структура точно такая же, как класс, за исключением видимости по умолчанию - по умолчанию public является общедоступным) а не приватно) и удалите их там. Конечно, это зависит от уместности (может быть, что-то еще выделено и принадлежит v1 и v2).

0 голосов
/ 23 июля 2011

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

0 голосов
/ 23 июля 2011

Структура внутри класса будет очищена при выходе из области видимости. ОДНАКО память v1 и v2, на которую указывают, НЕ будут автоматически очищены.

0 голосов
/ 23 июля 2011

если group владеет этими указателями у него должен быть деструктор, который их освобождает (как зависит от того, как вы их распределили).Кроме того, указатели group выделяются с new или malloc?Вы уверены, что вам нужен void*, а не какой-то конкретный тип?

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

...