Вызывает ли std::vector <T>:: clear() вызов деструктора содержимого?

Если у меня есть std::vector чего-то (скажем, выполняет ли std::vector:: clear() вызов деструктора содержимого? Например, если у меня есть данные как вектор, действует ли следующий код?

char * pd;
for(vector<char *>::iterator it = data.begin(); it != data.end(); ++it) {
  pd = *it;
  delete pd;
}

Или это избыточно, поскольку data.clear() будет делать это? Я полагаю, что нет, т.е. Требуется ручное освобождение содержимого. Предполагаю, data.clear() не будет вызывать неявный деструктор для содержимого? Правильно ли это? Это для pre С++ 11.

Ответ 1

Чтобы ответить на ваш заголовок: std::vector<T>::clear() вызывает деструктор для каждого элемента. Однако для примитивных типов данных, таких как char*, деструктор тривиален (standardese для "ничего не делает" ), который практически такой же, как если бы не вызывал деструктор.

Примечание. Деструктор не совпадает с оператором delete.

Итак, каков ваш вопрос: "Вызывает ли std::vector<T*>::clear() вызов delete на своих элементах?" , и вот ответ: Нет, он не вызывает delete. Вы должны сделать это вручную, как показано в вашем примере кода, или вы можете (и, вероятно, должны) использовать объекты, такие как std::string или интеллектуальные указатели вместо необработанных указателей. Это управление памятью для вас, и их деструкторы (которые вызываются, см. Выше) называют delete для вас.

Ответ 2

Если ваши элементы динамически распределены и ваш вектор содержит указатели на них, вам нужно вручную вызвать delete для каждого указателя в этом контейнере перед вызовом clear(). В противном случае у вас есть утечка памяти.

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

Ответ 3

std::vector clear() вызывает деструктор каждого элемента в векторе:

http://www.cplusplus.com/reference/vector/vector/clear/

Но в вашем случае он не удалит содержимое вашей выделенной динамической памяти. Я предлагаю использовать строку вместо char *