0

如果我有一个结构:

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;
4

5 回答 5

4

unsigned char data[HEX_FLASH_BUFFER];定义了一个具有自动存储时长的固定长度数组,这意味着当结构对象被释放时,它会被自动释放。

换句话说:你没有通过调用分配它,new[]所以没有理由调用delete[]它。

于 2013-02-17T17:48:55.883 回答
4

您不需要 delete data,因为它首先不是动态分配的。deletenew. 所以打电话delete hex;

综上所述,在现代 C++ 中,您基本上不会delete手动使用关键字。您使用智能指针shared_ptrunique_ptr管理动态分配的内存。但更常见的是仅使用本地(自动)变量。

另请注意:typedef struct { ... } name;应该只是struct name {...};. 前者是陈旧的。

于 2013-02-17T17:49:02.410 回答
1

delete(和delete[])简单地释放动态分配的内存(并为非 POD 类型运行析构函数,但这现在并不重要)。

data这里有自动存储期限。不仅delete[]在这里不起作用,它还会导致未定义的行为。如果您尝试进行delete非动态分配的内存,一个好的编译器会警告您。

即使内存不再标记为“正在使用”,您仍然可以访问它,但这会导致未定义的行为。

于 2013-02-17T17:51:44.990 回答
0
delete hex;

将删除分配给十六进制结构的内存

于 2013-02-17T17:50:04.493 回答
0

成员数据没有自动存储期限。它具有它作为非静态成员的类所具有的任何存储持续时间。

于 2013-02-17T18:36:37.437 回答