Если NULL присваивается переменным-указателям во время объявления, тогда free
сможет обрабатывать случаи, когда они никогда не malloc
также редактировались (это просто ничего не сделает). (Можно использовать и другие средства защиты, например, -1 для ссылки на недопустимый fd.)
Я использую это в сочетании с с использованием goto
для (дополнительной) очистки - некоторые другие ответы кажутся мне "многословными". Я считаю, что goto
нужно использовать разумно, чтобы избежать спагетти-кода, и, в общем, я нахожу, что "гуси вокруг гото" слишком сложно отслеживать постоянно. Дополнительное назначение NULL в первую очередь также позволяет использовать сами переменные в качестве проверки (во время любой возможной очистки или иным образом).
Удачного кодирования.
Пример:
void my_func() {
char *base_address = NULL;
char *ping_url = NULL;
if (base_address(getThis(), 0, &base_address TSRMLS_CC) == FAILURE) {
goto cleanup;
}
if (asprintf(&ping_url, "%s/ping", base_address) < 0) {
goto cleanup;
}
// stuff... and assign return value (or return directly) if applicable,
// assign NULL to variables which contain values that should
// not be free'd, etc (use as guards!).
// I prefer to add guards into the cleanup vs. "skip over it".
// I vary rarely, if ever, have multiple cleanup sections -- in most
// cases this would indicate the need for additional function(s) to me.
cleanup:
free(base_address);
if (ping_url) {
// perhaps need additional cleanup
free(ping_url);
}
// Return value, if applicable. (If a "direct return" above isn't
// advisable for the given function due to cleanup rules.)
}