この機能が登場したとき、私は"Understanding and Using C Pointers"のページを読んでいた。ダブルポインタ
void safeFree(void **pp) {
if (pp != NULL && *pp!= NULL) {
free(*pp);
*pp = NULL;
}
}
し、それからのコード例:
int main(int argc, char **argv) {
int* pi = (int*)malloc(sizeof(int));
*pi = 5;
safeFree((void**)&pi);
return EXIT_SUCCESS;
}
私のポイントは、if
でpp != NULL
をチェックしていますこのシナリオの条件は無用ですよね?このコードが書かれているように、この条件は決して偽ではないからです。しかし、**pp
がメモリアドレスを想定し、変数のメモリアドレスが決してNULL
になることはないと仮定すると、この条件が真となるシナリオがありますか?あるいは誰かがこのようなことをした場合に作家がその検査をしたか?
int main(int argc, char **argv) {
int **pi = NULL;
safeFree((void**)pi);
return EXIT_SUCCESS;
}
ありがとう。
*またはライターはケースの誰かで検診がこのような何かをしたことをやったやった*はい?それはまさにそのためです。関数を書くときは、例えばライブラリを書く場合など、関数のユーザではないかもしれないことに注意してください。特にポインタを扱うときは、明示的に 'NULL'をチェックし、それに応じて反応させるのが良いでしょう。 – Pablo
はい、逆参照する前にポインタの値を確認してください。 'NULL'ポインタを渡すと' free'は無害ですが、ポインタへのポインタもチェックしてください。 catchは最初のポインタで、逆参照した場合には 'NUL'が失敗します。 –
この関数はポインタを解放し、*をNULLに設定します*。これはダブルフリーを避ける方法です。 –