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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否需要在C ++析构函数中显式销毁结构中固定大小的数组?相关的知识,希望对你有一定的参考价值。

鉴于这样一个人为的示例结构:

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;

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

答案

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

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

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

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

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

some_struct* myHeapStruct = new some_struct(myStr2, 6);
另一答案

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

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

你可以使用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实例时卸载。

另一答案

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

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

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

以上是关于是否需要在C ++析构函数中显式销毁结构中固定大小的数组?的主要内容,如果未能解决你的问题,请参考以下文章

C++需要析构函数

C结构体中包含函数

在 C++ QObject 子类中调用析构函数之前执行操作

构造函数和析构函数

C++ 堆栈分配对象,显式析构函数调用

是否允许显式调用析构函数,然后在具有固定生命周期的变量上放置 new?