是否需要在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中显式销毁它。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否嵌套资源获取需要在Java中特殊处理?

销毁删除仍然需要析构函数可访问吗?

在C ++中,您是否需要在两个方向上重载operator ==?

检查是否需要在Git中拉

Future是否需要在单独的线程中执行计算?

在C ++(类)中,是否总是需要在头文件中声明函数?

我需要在C ++中对齐吗?

我是否需要在结构中释放结构?

是否需要在javascript中映射之前检查数组的长度?

是否需要在数组NavLink,Interface中使用?

是否需要在本地表中声明本地函数或变量?

是否总是需要在IIFE中关闭?

RVO是否需要在C ++ 11中启动移动构造函数/赋值?

是否需要在C#中显式引发异常?

在Linux中使用默认的gcc编译器时是否需要在C中释放指针?

是否需要在C中的每个调用上重置信号处理程序?

如果我在函数中使用指针来填充列表,是否需要在c ++中删除该函数末尾的指针?

是否需要在MYSQL中运行“ ROLLBACK”?

我是否需要在新类中声明构造函数和析构函数?

是否没有提供明确的析构函数不良做法?

我需要在C ++中取模

函数的char指针是否需要在C中分配内存

我是否需要在C#中释放对参数的记忆

QDialogs中是否需要析构函数?

在Transact SQL中,是否需要在简单的IF周围加上括号?

是否需要在不同的操作系统版本中测试 c# winform?

销毁树(析构函数)是否需要遍历通用树?

库类型的析构函数是否定义明确?

cos(x) 是否需要在使用 IEEE-754 的不同 C++ 實現中返回相同的值?