質問: 0; i < m; ++i) { free(a[i]); } free(a); }
回答: 関数名を変更して、割り当て演算子を正確に逆の順序で記述すれば、大丈夫です。 //free the arrays for (i = m-1; i >= 0; i--) { free(a[i]); } free(a); もちろん、まったく同じ逆の順序で割り当てを解除する必要はありません。同じメモリの解放を1度だけ追跡し、割り当てられたメモリへのポインタを「忘れない」ようにする必要があります(aを最初に解放した場合のように)。しかし、逆の順序で割り当てを解除することは、後者に対処するための優れた役割です。コメントの litb で指摘されているように、割り当て/割り当て解除に副作用がある場合(c++のnew/delete演算子のように)、割り当て解除の逆順でこの特定の例よりも重要です。