如果我有结构:
typedef struct {
unsigned char data[HEX_FLASH_BUFFER];
bool isLoad;
unsigned int length;
} s_hexFLASH;
typedef struct {
s_hexFLASH flash;
} s_hexFile;
s_hexFile *hex = new s_hexFile;
如何删除整个结构? 因为当a做了这样的事情时:
delete[] hex->flash.data;
在此之后,我仍然能够读取数据:
cout << hex->flash.data[0] << endl;
答案 0 :(得分:4)
unsigned char data[HEX_FLASH_BUFFER];
定义了一个具有自动存储持续时间的固定长度数组,这意味着当解除分配结构对象时它将自动解除分配。
换句话说:您尚未拨打new[]
进行分配,因此没有理由在其上调用delete[]
。
答案 1 :(得分:4)
您无需删除data
,因为它不是首先动态分配的。 delete
与new
成对。所以请致电delete hex;
所有这一切,在现代C ++中,您基本上不会手动使用delete
关键字。您可以使用智能指针shared_ptr
和unique_ptr
来管理动态分配的内存。但是通常只使用本地(自动)变量。
另请注意:typedef struct { ... } name;
应该只是struct name {...};
。前者过时了。
答案 2 :(得分:1)
delete
(和delete[]
)只是解除分配动态分配的内存(并为非POD类型运行析构函数,但现在这并不重要。)
data
这里有自动存储时间。 delete[]
不仅不起作用,还会导致未定义的行为。如果您尝试执行delete
非动态分配的内存,一个好的编译器会发出警告。
即使内存不再标记为“正在使用”,您仍然可以访问它,但这会导致未定义的行为。
答案 3 :(得分:0)
delete hex;
将删除分配给十六进制结构的内存
答案 4 :(得分:0)
NOT 的会员数据具有自动存储持续时间。它具有任何存储持续时间,它是非静态成员的类。