给出这样一个人为的示例结构:
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;
像这样的结构中的固定大小的数组是否需要在析构函数中显式销毁?
答案 0 :(得分:2)
结构是否需要显式析构函数来释放数组 记忆?我打算在堆栈和堆上使用结构,即
您没有在struct声明中编写任何指定堆中内存分配的代码。因此,数组声明不需要显式dtor来释放内存。
像这样的结构中的固定大小的数组是否需要显式 在析构函数中被摧毁了?
一个简单的经验法则是new
和delete
成对出现。每个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_struct
或new()
分配malloc()
,则数据将位于单个块中,在delete()
或free()
some_struct
时卸载实例。
答案 2 :(得分:0)
如果你的类在内部使用new
,那么你必须定义析构函数以适当地使用delete
:如果你定义了类的析构函数,你还应该定义类的复制构造函数&amp;重载operator=()
是指3,4或5的规则。
如果您的班级内部没有使用new
,那么没有。
如果您在其他一些代码中使用类本身的new,则必须在需要时删除该类。