Вызывает ли std::vector деструктор указателей на объекты?
Возможный дубликат:
Удаление указателей в векторе
Я знаю, когда разрушается std::vector
, он будет вызывать деструктор каждого из своих элементов. Вызывает ли он деструктор указателей на объекты?
vector<myclass*> stuff;
Когда материал уничтожается, удаляются ли отдельные объекты, на которые указывают указатели внутри материала?
Ответы
Ответ 1
Нет.
Как std::vector
должен знать, как уничтожить объект с указателем? Следует ли использовать delete
? delete[]
? free
? Некоторые другие функции? Как он должен знать, что объекты с указателем на самом деле распределены динамически или что он является Истинным Владельцем и несет ответственность за их уничтожение?
Если std::vector
является единственным истинным владельцем объектов с заостренными объектами, используйте std::unique_ptr
, потенциально с пользовательским удалением, чтобы обрабатывать очистку объектов.
Ответ 2
Как вы правильно сказали, вектор вызывает деструкторы для своих элементов. Итак, в вашем примере вектор выполняет вызов "деструкторов указателей". Однако вы должны иметь в виду, что типы указателей не имеют деструкторов. Только типы классов могут иметь деструкторы. А указатели - это не классы. Таким образом, правильнее сказать, что std::vector
применяет синтаксис псевдодеструктора к объектам-указателям, хранящимся в векторе. Для типов указателей, которые приводят к неработоспособности, т.е. Ничего не делает.
Это также отвечает на вторую часть вашего вопроса: уничтожаются ли объекты myclass
, указанные указателями. Нет, они не уничтожаются.
Кроме того, кажется, что вы каким-то образом считаете, что "вызов деструкторов по указателям" (первая часть вашего вопроса) - это то же самое, что "уничтожение остроконечных объектов" (вторая часть вашего вопроса). На самом деле это две совершенно разные несвязанные вещи.
Чтобы создать ссылку от первой к последней, т.е. чтобы вектор уничтожил заостренные объекты, вам нужно построить свой вектор из каких-то "умных указателей", в отличие от обычных указателей raw myclass *
, Вектор автоматически вызовет деструкторы "умных указателей", и эти деструкторы, в свою очередь, уничтожат заостренные объекты. Эта "ссылка" может быть реализована явно, внутри деструктора "умного указателя", поэтому обычные исходные указатели здесь не могут помочь.
Ответ 3
Нет; что, если вы сохранили указатель на автоматический объект?
vector<T*> v;
T tinst;
v.push_back(&tinst);
Если вектор вызывает деструкторы объектов, на которые указывают указатели, автоматический объект будет разрушен дважды - один раз, когда он выходит из области видимости, и один раз, когда вектор выходит из области видимости. Кроме того, что, если они не должны быть освобождены с помощью delete
? В любой ситуации он не мог вести себя надлежащим образом.
Если ваши объекты распределены динамически, вы должны вручную перебирать вектор и delete
каждый указатель, если он был выделен с помощью new
. Кроме того, вы можете создать вектор интеллектуальных указателей, который освободит объекты, на которые указывают указатели:
vector<shared_ptr<T>> v;
v.push_back(new T);