Стирание символа [] - PullRequest
       17

Стирание символа []

2 голосов
/ 20 ноября 2008

Хорошо, я работаю над чьим-либо другим кодом. Они делают много этого:

char description[256];
description[0]=0;

Я знаю, что это поставит \ 0 на первое место в массиве символов. Но это даже безопасный способ стереть строку?

Также Visual Studio продолжает сообщать об утечках памяти, и я в значительной степени привязал это к используемым строкам.

Ps. Да, я знаю о std :: string, да, я использую это. Это не мой код.

Ответы [ 6 ]

8 голосов
/ 20 ноября 2008

Установка первого элемента массива char на \ 0 достаточно, чтобы гарантировать, что 'description' - это правильно отформатированная, фактическая строка. Элементы с 1 по 255 могут быть мусором, если элемент 0 равен 0, описание - строка нулевой длины.

Вам не нужно беспокоиться об утечках памяти в приведенном выше коде, потому что массив расположен в стеке. Как только он выпадает из стека (выходит из области видимости), массив char освобождается.

8 голосов
/ 20 ноября 2008

Чтобы инициализировать строку в 0, вы можете сделать:

char description[256] = {0};

, который присваивает 0 каждому элементу массива.

Просто установка первого элемента на 0 ('\0') не стирает его содержимое. Это даже не гарантирует, что вся строка установлена ​​в нулевой символ.

Как утверждают другие, вы не можете "стереть" статически созданные объекты до тех пор, пока функция не закроется, когда ее закроют. Технически, это не стирается, когда функция прекращается - указатель стека просто изменяется. Если вы параноидально относитесь к стираемым данным, вам следует выполнить итерацию по массиву, установив для каждой записи значение 0 ('\0').

4 голосов
/ 20 ноября 2008

Чтобы уточнить хорошие ответы, данные до сих пор:

  • Да, description [0] = 0 очищает строку от функций strxxx POW: strlen (description) == 0, strcmp (description, "") == 0 и std :: string (description) == "" все верно.

  • Нет, описание [0] = 0 - это не то же самое, что free (описание) или memset (описание, 0, размер описания). Но вы уже знали это.

  • Часть кода, которую вы цитируете, не может привести к утечке памяти. Память не выделяется в куче, а утечки памяти - куча.

4 голосов
/ 20 ноября 2008

Эта строка размещается в стеке, поэтому нет возможности освободить используемую память до тех пор, пока не вернется функция, которую она вызывает, (когда это произойдет автоматически). Если вы не вызываете эту функцию рекурсивно *, это никоим образом не приведет к утечке памяти, потому что как только функция вернет пространство, оно будет использовано для будущих кадров стека. И если вы беспокоитесь о безопасности, вам нужно просто пройтись по нему и обнулить элементы строки.

Если вам нужен свободный () блок памяти, вы можете сделать следующее и разместить массив в куче:

char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array
...
// some code here
...
free(str); // free the memory

* это не реальная утечка памяти, но некоторые люди говорят «утечка памяти», когда они имеют в виду «кончается память». В любом случае, пространство стека намного более ограничено, чем пространство кучи, поэтому вам нужно следить за размером используемых там блоков памяти.

3 голосов
/ 20 ноября 2008

Помещение \0 в первый элемент строки является безопасным способом очистки строки, но это не то же самое, что удаление строки и не предотвратит утечки памяти.

1 голос
/ 20 ноября 2008

Если это строка char [], и единственные операции, выполняемые с ней, это строковые функции, это нормально. Конечно, этого недостаточно для защищенных данных.

Что касается утечек памяти, возможно, стоило бы перейти на безопасные версии строковых функций, но вы не можете пропускать статические или основанные на стеке строки, так что, вероятно, это где-то ваша строка.

Для ясности я бы изменил его на '\ 0'.

...