Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > strcat , strcpy - освобождение памяти


Автор: PRF 16.4.2009, 21:28
Здравствуйте, извините за такие вопросы, но, подскажите пожалуйста почему после применения функции strcat и strcpy к динамически выделенному массиву, delete не работает, а выдает ошибку при выполнении программы.

Код

char* dir = new char[6];
strcpy(dir, "folder");
delete[] dir; // ошибка


а вот ща несколько минут назад сделал с strcpy_s и похоже работает.. почему так?

Автор: mrbrooks 16.4.2009, 21:36
PRF, ошибку выдает именно при удалении или все таки при копировании  smile 

так же будет все ОК?
Код

char* dir = new char[6];
//strcpy(dir, "folder");
delete[] dir; 


не забывай что строка заканчивается на '\0' - а это +1 символ

поэтому 
Код

char* dir = new char[7];
strcpy(dir, "folder");
delete[] dir; 

и будет гуд.

а вообще камрад юзай std::string

Автор: ISergeyN 16.4.2009, 21:36
char* dir = new char[7];

Автор: PRF 16.4.2009, 21:45
Ага все, спасибо, ступил(( 

Автор: inside_pointer 17.4.2009, 18:17
Код

char* dir = new char[6];
strncpy(dir, "folder", strlen("folder"));
delete[] dir; // ошибка


smile

Автор: zim22 17.4.2009, 18:43
inside_pointer, C-строки должны заканчиваться 0-символом. Иначе функции для работы с ними будут работать некорректно.

Автор: inside_pointer 18.4.2009, 03:10
как же тогда strncpy нуль-символ не записывает, или она не строковая ? smile
просто, если он хочет записать в шесть байт, он может это сделать, и любой функцией, которой захочет
главное-то в них, что они всегда правильно работают (предсказуемо)

а для чтения тоже можно написать соответствующую обёртку или не писать а пользоваться любыми доступными средствами, переносимыми и так далее smile

Автор: zim22 18.4.2009, 07:43
Цитата(inside_pointer @  18.4.2009,  03:10 Найти цитируемый пост)
как же тогда strncpy нуль-символ не записывает, или она не строковая ?

С-строка - это массив символов, заканчивающийся нулём. И этот самый ноль вы не копируете. Т.к. он находится по индексу strlen("folder") + 1

inside_pointer, вы настаиваете на том, что правильно скопировали строку?  smile ...

Автор: inside_pointer 18.4.2009, 08:39
zim22, я говорю, что strncpy не копирует нуль-символ, когда не доходит до него, как ты объяснишь отсутствие у строковой функции этого действия со своими тезисами ? smile

Автор: zim22 18.4.2009, 08:47
Цитата(inside_pointer @  18.4.2009,  08:39 Найти цитируемый пост)
как ты объяснишь отсутствие у строковой функции этого действия со своими тезисами

Функция strncat копирует количество символов, заданное третьим параметром функции. Если вы используете функцию strncat, а не strcat - то ответственность за корректное копирование ложится на вас, а не на компилятор. 

Цитата(inside_pointer @  17.4.2009,  18:17 Найти цитируемый пост)
char* dir = new char[6];

здесь вы создаёте массив из шести объектов типа char. 


Цитата(inside_pointer @  17.4.2009,  18:17 Найти цитируемый пост)
strncpy(dir, "folder", strlen("folder"));

В этой строке вы копируете 6 символов в масив dir. Но проблема в том, что строка содержит не 6, а 7 символов. И 7 символ вы не копируете. В результате строка, помещённая в массив dir не будет содержать завершающий 0-символ и строка dir "продлится" до тех пор, пока не встретит 0- символ в чужой области памяти.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)