Вызывает ли 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 *