:BASE_ADDRESSへの最初の呼び出しが成功し、asprintfへの2回目の呼び出しは()が失敗した場合は?このような関数宣言を考える
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);
}
を、どのように私はきれいに安全に割り当てられたを解放するために、関数の最後までスキップしますメモリ?
メモリが次々に割り当てられている(各割り当てが失敗する場合があります)あまりにも多くのコードの重複や後藤文なしにこのような状況でメモリリークを回避するための方法をいくつかの標準的なパターンはありますか?
後藤は後藤と間違って何ここ –
あなたの友達ですか? do while(0)構文を使うことができますが、それは基本的に同じことです。 – Luke
RAIIはどうですか? – Dani