Я поддерживаю некоторый код c Соляриса, и я видел что-то странное, по крайней мере, я думаю, что это:
char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);
Мое понимание - то, что, так как переменная является локальным массивом, память прибывает из стека и не должна быть освобождена, и кроме того так как никакой malloc/calloc/realloc не использовался, поведение не определено.
Это - система реального времени, таким образом, я думаю, что это - трата циклов. Я пропускаю что-то очевидное?
Вы можете освободить () только то, что получили с помощью функций malloc (), calloc () или realloc (). освобождение чего-либо в стеке приводит к неопределенному поведению, вам повезло, что это не приводит к сбою вашей программы или того хуже.
Считайте это серьезной ошибкой и удалите эту строку как можно скорее.
Определенно ошибка. free ()
ДОЛЖЕН использоваться ТОЛЬКО для памяти, выделенной кучей, если только она не переопределена для выполнения чего-то совершенно другого, что я сомневаюсь в этом.
Free () определенно является ошибкой.
Однако, возможно, здесь есть еще одна ошибка:
strcpy(new_login, (char *)login);
new_login[sizeof(new_login)-1]='\0';
strncpy(new_login, (char *)login, sizeof(new_login)-1 );
В большинстве случаев вы можете освободить () только что-то, размещенное в куче. См. http://www.opengroup.org/onlinepubs/009695399/functions/free.html .
ОДНАКО: Один из способов сделать то, что вы хотели бы делать, - это использовать область видимости временных переменных, размещенных в стеке. примерно так:
{
char new_login[64];
... /* No later-used variables should be allocated on the stack here */
strcpy(new_login, (char *)login);
}
...
Спасибо. Рад видеть, что я не сумасшедший. Кроме того, не было проверки границ для strcpy. Я обычно использую strncpy, чтобы избежать подобных вещей.
№ Это ошибка.
Согласно free (3) ....
free () освобождает пространство памяти, на которое указывает ptr, которое должно быть возвращено предыдущим вызовом {{ 1}} malloc (), calloc () или realloc (). В противном случае, или если free (ptr) уже был вызван ранее, возникает неопределенное поведение . Если ptr равен NULL, операция не выполняется.
Итак, в вашей программе происходит неопределенное поведение.