是否需要在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来释放内存。
在这样的结构中固定大小的数组是否需要在析构函数中显式销毁?
一个简单的经验法则是new
和delete
成对出现。每个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_struct
或new()
分配malloc()
,数据将在一个块中,当你delete()
或free()
some_struct
实例时卸载。
如果你的类在内部使用new
,那么你必须定义析构函数以适当地使用delete
:如果定义类的析构函数,你还应该定义类的复制构造函数和重载的operator=()
参考3,4或5的规则。
如果你的班级内部没有使用new
那么没有。
如果您在其他一些代码中使用类本身的new,则必须在需要时删除该类。
以上是关于是否需要在C ++析构函数中显式销毁结构中固定大小的数组?的主要内容,如果未能解决你的问题,请参考以下文章