带有多集容器的类的析构函数

destructor for a class with a multiset container c++ 11

本文关键字:析构函数      更新时间:2023-10-16

我有一个使用multiset作为容器的类:

multiset<string, SortFunction> elements;

在析构函数中,我应该如何擦除multiset ?我应该删除它,还是删除其中的所有元素?

如果元素的析构函数可以正确地清理它们自己(std::string就是这样做的),那么您不需要做任何事情。

multiset将负责清洁自己,并且也将清理元素。

根据c++标准(12.4析构函数)

8在执行析构函数体并销毁任何在主体内自动分配对象,类X的析构函数为X的直接非变量非静态数据调用析构函数…

因此,类的析构函数将调用multiset的析构函数,而multiset又将在释放为元素分配的内存之前调用其元素的析构函数。

不需要做任何事情,当元素被删除时,所有关联的元素也将被删除(包括您使用的函子),如下例所示。

#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;
}