我需要实现析构函数吗?对于一个 std::map<struct, int> 对象。

3

你好,在一个 C++ 类 X 中,我有一个

class X{
    private:
        std::map<some_struct, int> C;
}

如果有一个定义如下的结构体 some_struct:

typedef struct{
    int a;
    int b;
    int c;
}some_struct;

我的问题是:在X的析构函数中,我需要指定关于地图C的任何内容吗?如果需要,X的析构函数应该为地图C执行哪些操作?

在类X的析构函数中调用一个删除函数或擦除函数,该函数遍历每个元素并将其从映射中删除,并调用该函数。 - Omid CompSCI
3
@OmidCompSCI 请不要这样做。std::map 的析构函数可以更有效地完成此操作。 - Bryan Chen
4
你应该遵循"零成员函数原则":http://en.cppreference.com/w/cpp/language/rule_of_three https://rmf.io/cxx11/rule-of-zero/ - Bryan Chen
3个回答

5
不需要为some_structclass X指定析构函数,编译器会自动生成它。只要没有用newnew[]在动态存储中显式分配该类的内存,就不需要编写析构函数来应用deletedelete[]操作。
此外,在编写C ++代码时(与C相比),不需要使用typedef语法。
struct some_struct {
    int a;
    int b;
    int c;
};

1
所有类型都会生成析构函数。 - NathanOliver
1
所有类都会自动生成析构函数。 - M.M
只要类X没有显式分配任何内容,如果some_struct分配了内存,则应在some_struct的析构函数中释放。 - Carl

2
只要不引入新的运算符,您可以使用默认的析构函数。所有STL容器(map、vector、list、deque等)都不需要特殊的析构函数。它们是自包含的并且设计得很清晰,一旦超出作用域就会自动销毁。

new 运算符并不是判断是否需要析构函数的好指标。我可以使用 unique_ptr<some_struct>(new some_struct),但仍然可以保存。 - Bryan Chen
@BryanChen,仍然适用于“如果没有新的内容,则可以使用默认析构函数”,但这并不意味着相反的情况:如果您有新的内容,则需要更多的内容而不是默认析构函数,正如您的反例所示。 - 463035818_is_not_a_number
@BryanChen 你可以这样做,但那是一个bug。如果智能指针的构造函数抛出异常,那么你就会泄漏内存。这就是使用make函数的原因之一。 - NathanOliver
@NathanOliver 这只是避免使用 new 的另一个原因。 - Bryan Chen

0
如果你使用new运算符在堆上动态分配了对象,那么在析构函数中需要关注C。例如:
class X{
    public:
        X();
    private:
        std::map<some_struct, int> *p_C;
}

在定义中:

X::X() {
  p_C = new map<some_struct, int>();
}

X::~X() {
  if(p_C) delete p_C;
}

1
不,你不需要这样做,因为在这种情况下你将使用智能指针。 - BeyelerStudios
1
@πάνταῥεῖ 现在谁在挑毛病呢 :P - M.M
@M.M 至少这是一个严肃的挑剔 :P - πάντα ῥεῖ
@πάνταῥεῖ,其实不是这样的,通常heap指的是动态内存分配。 - M.M
@M.M:“这是常见的理解...”然而,标准规范并没有涉及到这一点。 - πάντα ῥεῖ
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接