Деструктор для класса с контейнером мультимножества C++ 11
У меня есть класс, который использует multiset
в качестве контейнера:
multiset<string, SortFunction> elements;
В деструкторе, как я должен стереть multiset
? Должен ли я удалить его или удалить все элементы в нем?
3 ответа
Если элементы имеют деструкторы, которые убираются должным образом - что std::string
делает - тогда вам ничего не нужно делать.
multiset
позаботится о самой очистке, и это также очистит элементы.
Согласно стандарту C++ (12,4 деструкторов)
8 После выполнения тела деструктора и уничтожения любых автоматических объектов, размещенных в теле, деструктор для класса X вызывает деструкторы для прямых не вариантных нестатических элементов данных X....
Таким образом, деструктор вашего класса вызовет деструктор мультимножества, который, в свою очередь, вызовет деструкторы его элемента, прежде чем освободить выделенную память для элементов.
Не нужно ничего делать, когда элементы удаляются, все ассоциативные элементы также будут удалены (включая используемый вами функтор), как в примере ниже.
#include <iostream>
#include <set>
#include <string>
template<typename T>
struct CompFunctor: std::less<T> {
~CompFunctor() {
std::cout << "CompFunctor is deleted " << std::endl;
}
};
int main() {
{
std::set<std::string, CompFunctor<std::string>> m;
m.insert("a");
m.insert("a");
m.insert("b");
std::cout << "!!! start !!!" << std::endl;
} // m is deleted.
std::cout << "!!! end !!!" << std::endl;
return 0;
}