Рассмотрим эту программу:Другой способ очистки в C?
int main(void)
{
int* i = malloc(sizeof(int));
int* j = malloc(sizeof(int));
}
Однако это наивный подход, поскольку malloc
может произойти сбой и указатели не являются free
«d.
Таким образом, вы можете сделать это:
int main(void)
{
int* i;
int* j;
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
if ((j = malloc(sizeof(int)) < 0)
{
free(i);
return -1;
}
free(i);
free(j);
}
Однако я считаю, что это очень подвержены ошибкам. Подумайте, нужно назначить 20 указателей, в последнем случае ошибки malloc
, вы должны указать free
19 переменных, а затем return -1
.
Я также знаю atexit
, который может помочь мне написать это:
int* i;
int* j;
void del_i(void)
{
free(i);
}
void del_j(void)
{
free(j);
}
int main(void)
{
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_i);
}
if ((j = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_j);
}
}
Что лучше, но я не люблю того, чтобы объявить все указатели как глобальные. Есть ли какой-нибудь способ, чтобы объединить эти два подхода, в основном:
- Имея деструкторов для указателей, которые могут быть либо выполнены непосредственно или использованы с
atexit
. - Наличие указателей, локальных для функций.
Я не понимаю вашу точку. Если вы заканчиваете/останавливаете выполнение программы, зачем беспокоиться о 'free()'? –
1. Вы всегда должны указывать указатели 'free'. 2. Подумайте об этом в контексте более масштабной программы. – hgiesel
Спасибо, что просветили меня, но я буду придерживаться своей версии. :) –