2013-02-17 4 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; 

После этого I'am еще умеют читать данные:

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

Не слишком строгий дубликат, но та же тема, и [очень известный] ответ - ответ на ваш вопрос. –

+0

'delete' не волшебным образом отключает бит в вашей памяти, он просто помечает его как доступный. Другими словами, вы все равно можете его прочитать, но кто-то может использовать его для других вещей в любое время. –

ответ

4

Вам не нужно удалять data, так как он не распределяется динамически в первую очередь. delete пар с new. Поэтому звоните delete hex;

Все, что сказано, в современном C++ вы в основном не используете ключевое слово delete вручную. Для управления динамически выделенной памятью вы используете интеллектуальные указатели shared_ptr и unique_ptr. Но более обычным является использование локальных (автоматических) переменных.

Также примечание: typedef struct { ... } name; должно быть только struct name {...};. Первый - архаичный.

+0

Или просто используйте локальную переменную. –

4

unsigned char data[HEX_FLASH_BUFFER]; определяет массив фиксированной длины с автоматической продолжительности хранения, а это означает, что он будет автоматически освобождено, когда объект структуры будет освобожден.

Другими словами: вы не выделили его, позвонив по телефону new[], поэтому нет причин для звонка delete[].

0
delete hex; 

удалит память, выделенную для шестигранной структуры

+0

@Lodhart: Что еще более важно на ваш вопрос, массив данных не был распределен динамически, поэтому нет необходимости называть delete на нем. Но гекс выделялся динамически. Так вот вы вызываете delete. –

1

deletedelete[]) просто DEALLOCATE динамически выделенной памяти (и запустить деструктор для неконтактного типа POD, но это не важно сейчас).

data Здесь имеется автоматическая продолжительность хранения. Здесь не только delete[], но и вызывает неопределенное поведение. Хороший компилятор предупредит вас, если вы попробуете сделать delete нединамически выделенную память.

Даже если память больше не помечена как «in-use», вы все равно можете ее получить, но это приводит к неопределенному поведению.

0

Данные участника NOT имеют автоматическую продолжительность хранения. У него есть время хранения, в котором класс нестационарный.

Смежные вопросы