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

时间:2017-12-16 00:48:07

标签: c++ arrays struct

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

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;

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

3 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

但是,以下行将结构的实例放在堆上(因为您使用的是new)。因此,在情况下,您需要使用delete来释放分配的内存。

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

答案 1 :(得分:1)

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

数组是结构数据的一部分,因此在销毁结构时它将被销毁。

您可以使用sizeof()

查看此信息
struct some_struct
{
    char[64] data;
};

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

一般来说,每次破坏都与创造相匹配;只有在明确创建它时才明确销毁某些东西。如果在堆栈上声明some_struct实例,则在some_struct超出范围时将卸载数据。如果您使用some_structnew()分配malloc(),则数据将位于单个块中,在delete()free() some_struct时卸载实例。

答案 2 :(得分:0)

如果你的类在内部使用new,那么你必须定义析构函数以适当地使用delete:如果你定义了类的析构函数,你还应该定义类的复制构造函数&amp;重载operator=()是指3,4或5的规则。

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

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