関数からポインタを返したい場合、何がより良く、より安全でしょうか?
void pro_register_application(WNDCLASS* wc); /* use wc in function */
また
WNDCLASS* pro_register_application(void)
{
WNDCLASS* wc = malloc( sizeof(WNDCLASS) );
...
return wc;
}
処理されるバッファの所有権の詳細を適切に文書化する限り、両方とも同じであり、どちらを選択するかは選択の問題によって異なります。
2番目のサンプルのユーザーは、バッファーの所有権が自分に譲渡されていることを明確に伝える必要があります。そのため、バッファーの割り当てを解除する責任があります。
関数にデータ構造を作成させてポインターを返すことを選択した場合(2番目の方法、そこまで)、呼び出し元は、スペースをどのように割り当てたかを知る必要があります... malloc()またはGlobalAlloc()を使用しましたか、または他のメカニズム?...次に、対応するメソッドを使用して問題を取り除きます。これは、クライアントにスペースを割り当ててポインターを渡すようにするのに十分な理由です。
とは言うものの、メモリの割り当てを正しく解除するために適切な注意を払っていれば、どちらの方法を使用しても誰も殺すことはありません。
これがCOMオブジェクトが役立つ理由の1つです。クライアントは、オブジェクトがどのように作成されたかを知る必要はなく、完了したらRelease()を呼び出すだけです。