【问题标题】:Does a fixed sized array in a struct need to be explicitly destroyed in a C++ destructor?结构中固定大小的数组是否需要在 C++ 析构函数中显式销毁?
【发布时间】:2017-12-16 00:48:06
【问题描述】:

给定一个这样的人为示例结构:

static const int ARRAY_SIZE = 64;

struct some_struct
{
    int buffer_size;
    char buffer[ARRAY_SIZE] { 0 };

    some_struct(char* str, int str_len) :
        buffer_size(ARRAY_SIZE)
    {
        for (int i = 0; i < str_len; i++)
        {
            buffer[i] = str[i];
        }
    }
};

结构是否需要显式析构函数来释放数组的内存? 我打算在堆栈和堆上使用结构,即

// Stack
//
char myStr1[] = "string1";
some_struct myStackStruct(myStr1, 6);

...

// Heap
//
char myStr2[] = "string2";
some_struct* myHeapStruct = new some_struct(myStr2, 6);

...

delete myHeapStruct;

像这样的结构中的固定大小的数组是否需要在析构函数中显式销毁?

【问题讨论】:

  • 没有。只有deletenew
  • 你也不需要在构造函数的成员初始化列表中提及它
  • 使用 std::string,而不是 char 数组。

标签: c++ arrays struct


【解决方案1】:

结构是否需要显式析构函数来释放数组的 记忆?我打算在堆栈和堆上使用结构,即

您没有在结构声明中编写任何代码来指定堆中的任何内存分配。因此,数组声明不需要显式 dtor 来释放内存。

在这样的结构中固定大小的数组是否需要明确 在析构函数中销毁?

一个简单的经验法则是newdelete 成对出现。每个new 都应该有一个delete。在您的结构声明中,您没有调用 new,因此您不需要在 dtor 中显式销毁它。

然而,下一行将结构的一个实例放在堆上(因为您使用的是new)。所以在这种的情况下你需要使用delete来释放分配的内存。

some_struct* myHeapStruct = new some_struct(myStr2, 6);

【讨论】:

  • 另一个经验法则是您只能删除一个指针。数组不是指针。
  • "您没有编写任何代码来指定堆中的任何内存分配。"这不是堆内存吗? some_struct* myHeapStruct = new some_struct(myStr2, 6);
  • @ChrisMcJava:这是从堆中分配的。但是,我指的是您的结构声明,我已经编辑了我的答案以澄清这一点。
【解决方案2】:

不,固定大小的数组成员不需要显式销毁。

数组是你结构体数据的一部分,所以当你销毁结构体时它会被销毁。

你可以使用sizeof()看到这个:

struct some_struct
{
    char[64] data;
};

static_assert(sizeof(some_struct) == 64 * sizeof(char));

一般来说,每一次毁灭都与一次创造相匹配;只有当你明确地创建它时,你才会明确地销毁它。如果您在堆栈上声明some_struct 实例,则当some_struct 超出范围时,数据将被卸载。如果您使用new()malloc() 分配some_struct,则数据将在单个块中,当您delete()free() some_struct 实例时卸载。

【讨论】:

    【解决方案3】:

    如果您的类在内部使用new,那么您必须定义析构函数以适当地使用delete:同样,如果您定义类的析构函数,您还应该定义类的复制构造函数并重载operator=(),请参阅规则3 ,4 或 5。

    如果你的班级没有在内部使用new,那么没有。

    如果您在其他一些代码中对类本身使用 new,那么您必须在需要时删除该类。

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2011-10-11
      • 2011-11-28
      • 2016-02-28
      相关资源
      最近更新 更多