Data una dichiarazione di funzione come questa:Come liberare memoria allocata in precedenza in caso di errori?
int base_address(zval *object, int add_prefix, char **base_address TSRMLS_DC) {
int result;
char *host;
long port;
char *prefix;
host = ... get host from object ...;
port = ... get port from object ...;
prefix = ... get prefix from object ...;
result = SUCCESS;
if (asprintf(base_address, "%s:%ld/%s", host, port, prefix) < 0) {
result = FAILURE;
}
return result;
}
void my_func() {
char *base_address;
char *ping_url;
if (base_address(getThis(), 0, &base_address TSRMLS_CC) == FAILURE) {
MALLOC_ERROR();
}
if (asprintf(&ping_url, "%s/ping", base_address) < 0) {
MALLOC_ERROR();
}
... do some stuff with base address ...
// release both, as everything worked
free(base_address);
free(ping_url);
}
Se la prima chiamata a base_address riuscito e la seconda chiamata a asprintf() non è riuscito, come faccio in modo pulito saltare alla fine della funzione al fine di rilasciare in modo sicuro allocato memoria?
C'è qualche schema standard su come evitare perdite di memoria in queste situazioni in cui la memoria viene assegnata una dopo l'altra (e ogni allocazione potrebbe fallire) senza troppe duplicazioni di codice o istruzioni goto?
goto è tuo amico qui –
Cosa c'è di sbagliato con goto? Potresti usare un do do while (0), ma fondamentalmente è la stessa cosa. – Luke
Che mi dici di RAII? – Dani