2013-02-17 114 views
0

如果我有一个结构:如何删除数组C++?

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; 

如何删除这个整体结构? 因为当一个做是这样的:

delete[] hex->flash.data; 

此我'仍然能够读出的数据之后:

cout << hex->flash.data[0] << endl; 
+0

不是严格的重复,而是相同的主题,[非常有名]的答案也是您的问题的答案。 – 2013-02-17 17:49:06

+0

'delete'不会奇迹般地关闭内存中的位,它只是将其标记为可用。换句话说,你仍然可以阅读它,但有人可能随时将它用于其他事情。 – 2013-02-17 17:49:14

回答

4

您不需要删除data,因为它不是首先动态分配的。 deletenew配对。所以请致电delete hex;

所有这一切都说,在现代C++中,您基本上不会手动使用delete关键字。您可以使用智能指针shared_ptrunique_ptr来管理动态分配的内存。但使用本地(自动)变量更为常见。

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

+0

或者只是使用一个局部变量。 – 2013-02-17 17:54:03

4

unsigned char data[HEX_FLASH_BUFFER];定义固定长度具有自动存储持续时间,的阵列,这意味着它将在解除分配结构对象时自动解除分配。

换句话说:您还没有通过调用new[]来分配它,所以没有理由对它调用delete[]

0
delete hex; 

将删除分配到六角结构

+0

@Lodhart:对你的问题更重要的是,数据数组没有动态分配,所以不需要在它上面调用delete。但十六进制是动态分配的。这就是你称之为删除的地方。 – 2013-02-17 17:58:46

1

delete(和delete[])内存只是解除分配动态分配的内存(并运行非POD类型的析构函数,但现在并不重要)。

data这里有自动存储时间。 delete[]不仅在这里工作,它会导致未定义的行为。一个好的编译器会警告你,如果你尝试做非动态分配的内存。

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

0

会员数据是不是有自动存储时间。它具有任何存储持续时间,它是非静态成员所拥有的类。