Подтвердить что ты не робот

Вызывает ли std::vector деструктор указателей на объекты?

Возможный дубликат:
Удаление указателей в векторе

Я знаю, когда разрушается std::vector, он будет вызывать деструктор каждого из своих элементов. Вызывает ли он деструктор указателей на объекты?

vector<myclass*> stuff;

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

4b9b3361

Ответ 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);