删除具有类成员的结构

Deleting a struct that has a class member

提问人:Troy Hamilton 提问时间:7/21/2023 更新时间:7/21/2023 访问量:59

问:

我有一个结构:

struct holder
{
    int val;
    std::unordered_map<int, int> num_to_addr;
};

我动态分配一个结构体持有者:

struct holder* handle = new struct holder;

我确实在工作,然后想解除分配它:

delete handle;

我的问题是,手柄内部的unordered_map也会被破坏吗?

我正在运行使用上述代码的生产代码,该程序存在内存泄漏,该泄漏已好几天未被发现。我想知道这是否是导致内存泄漏的原因,因为此代码只运行了几次,而且泄漏也是间歇性的,所以可能就是这样,但没有人确切知道。

C++ 析构函数 new-operator delete-operator default-constructor

评论

1赞 Chris 7/21/2023
风格说明:=>甚至struct holder* handle = new struct holder;holder* handle = new holder;auto handle = new holder;
0赞 Ben Voigt 7/21/2023
编译器自动生成析构函数。自动生成的析构函数为每个成员和基子对象调用析构函数。
1赞 Ben Voigt 7/21/2023
@Chris:或者,然后以后是不必要的。auto handle = std::make_unique<holder>();delete handle;
2赞 Drew Dormann 7/21/2023
是的,摧毁一个类(它是一个类)也会摧毁该类的成员。
6赞 PaulMcKenzie 7/21/2023
struct holder* handle = new struct holder; -- 我正在运行使用上述代码的生产代码 - 显然是由程序员编写的,而不是C++程序员。C

答:

0赞 Chris 7/21/2023 #1

是的,映射的析构函数将由自动生成的析构函数调用。现在,如果是动态分配的,并且没有像这样使用智能指针,那么您将需要编写一个显式删除它的析构函数。holdernum_to_addrstd::unique_ptr

例如

struct holder {
    int val;
    std::unordered_map<int, int> *num_to_addr;

    // a bunch of constructors and copy assignment 
    // operators and such...

    ~holder() {
        delete num_to_address;
    }
};