###環境
Windows10 64bit / Visual Studio 2019
C++17
###知りたいこと
CComBSTR のコンストラクタ内の SysAllocString にて、確保済みのメモリが上書きされる事象が発生しました。
この事象が発生する原因を知りたいです。
###コード
C++
1CComBSTR test(const CComSafeArray<VARIANT>& var) { 2 return CComBSTR(L"ABC"); 3}
上述のコードでは、CComSafeArray<VARIANT> 型配列 var の一番最初の要素が L"ABC" に書き換わります。
CComBSTR の該当のコンストラクタは以下の通りです。
C++
1CComBSTR(_In_opt_z_ LPCOLESTR pSrc) 2 { 3 if (pSrc == NULL) 4 { 5 m_str = NULL; 6 } 7 else 8 { 9 m_str = ::SysAllocString(pSrc); 10 if (!*this) 11 { 12 AtlThrow(E_OUTOFMEMORY); 13 } 14 } 15 }
m_str = ::SysAllocString(pSrc); の箇所で m_str に充てられるアドレスが上のコードの var の一番最初の要素のアドレスとなっており、結果、元の値が pSrc で上書きされる様な結果となります。
###補足
CComBSTR test() の引数 var を const にしなくとも同様の事象が発生します。
また、参照渡しでなく値渡しにした場合はこの事象は発生しません。
先日投稿した質問も同じ様な事象が発生しています。
Invoke や SysAllocString の内部で実行される共通の処理が原因ではないか、と思っています。
しかし、自力ではそれを確認する手段がなく、ご助力願いたく質問させて頂きました。
本件、および先日の質問につきまして、
何か思い当たる点のある方は、些細なことでも構いませんので是非ご意見下さい。
回答1件
あなたの回答
tips
プレビュー