1

MSDNによると:

パラメーターの場合[out]、メソッドまたはプロパティがメモリを割り当て、呼び出し元がメモリを解放する責任があります。

正しいのは次のうちどれですか。

[...]
STDMETHOD(Method)([out] BSTR* psValue)
[...]

BSTR myBStr1;
Method(&myBStr1);
::SysFreeString(myBStr1);

BSTR myBStr2 = SysAllocString(L"MyStringValue");
Method(&myBStr2);
::SysFreeString(myBStr2);

BSTR myBStr3 = NULL;
Method(&myBStr3);
::SysFreeString(myBStr3);
4

2 に答える 2

4

はい、ゴミは許容されます。メソッドは、値を初期化する責任があります。呼び出し元は、解放のみを担当します。

MSDN on out 属性:

[out] のみのパラメーターは、リモート プロシージャが呼び出され、オブジェクトのメモリがサーバーによって割り当てられると、未定義と見なされます。

1号、3号はOKです。#2は、メモリリークを作成しようとしています。

このルールは、実際には混乱を引き起こしています。メソッドがエラーを返した場合、値が既に初期化されているかどうかわからないことがあります。ガベージを解放しようとすると、アクセス違反やメモリの破損が発生します。メモリの解放をスキップし、部分的に成功したメソッドがそこに意味のあるものを残した場合 (まあ、これはサーバー側の問題ですが)、メモリ リークが発生します。NULL呼び出しの前に初期化する方が確かに安全CComBSTRです。たとえば、コンストラクターがそれを行います。サーバー側ではNULL、[out] 値の初期化でメソッドを開始して、後で誤って初期化されないままにしないようにすることができます。

于 2013-06-07T11:31:54.920 に答える