このプログラムを考えてみましょう:
int main(void)
{
int* i = malloc(sizeof(int));
int* j = malloc(sizeof(int));
}
malloc
ただし、失敗する可能性があり、ポインターが作成されないため、これは単純なアプローチfree
です。
だからあなたはこれを行うことができます:
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);
}
}
どちらの方が良いですが、すべてのポインターをグローバルとして宣言する必要はありません。基本的に、これら2つのアプローチを組み合わせる方法はありますか:
- ポインタのデストラクタを持ち、直接実行するか、
atexit
. - 関数にローカルなポインタを持つ。