私はこの機能を持っています、
vector<QDC::AdapterUserInfo> QDC::QueryInterface::RetrieveAdapterList()
{
vector<QDC::AdapterUserInfo> retVal;
InnerQueryInterface::IISTATE::Transition trans = _IQI->AdapterList(retVal);
if (trans._OldState == trans._NewState)
{
if ( trans._NewState != InnerQueryInterface::IISTATE(trans._OldState).SuccessfulTransition(trans._Transition) )
{
throw Exceptions::FunctionFailed();
}
}
return retVal;
}
QDC
名前空間です。QueryInterface
を使用してエクスポートされるクラス__declspec(dllexport)
です。( lib を含む DLL が生成されます ) 他のプロジェクトでは、この関数を次のように使用します。
vector<QDC::AdapterUserInfo> aui = Qui.RetrieveAdapterList();
ただし、リリース ビルドでは、ベクターは常にサイズ 0 で返されます。ただし、サイズ 1 (実際の要素数) で返されます。リリース モードでデバッグしたところretVal
、関数内がRetrieveAdapterList
実際のデータで満たされ、関数の最後の行であるline で、ベクトルが空になるreturn retVal;
ことが示されていることがわかりました。そのため、最後に返される値は空のベクターです。retVal
cleared
なぜこうなった?なにが問題ですか?なぜデバッグモードで動作するのですか?
- 編集 -
aui
スコープの最後まで実行を続けた後、ベクトルのデストラクタが失敗したようです。
-- 発信者からのコード --
void DXE::Screen::Initialize( const HWND in_Window, const bool in_Windowed )
{
QDC::UsableParameters UP;
QDC::QueryInterface Qui;
vector<QDC::AdapterUserInfo> aui = Qui.RetrieveAdapterList();
if( aui.size() <= 0 )
{
throw Exceptions::UnknownException();
}
Qui.SelectAdapter(0);
Qui.SelectDisplayMode(in_Windowed);
UP = Qui.RetrieveParameters();
_AdapterOrdinal = UP._AdapterOrdinal;
_D3DPresentParams.BackBufferWidth = UP._Width;
_D3DPresentParams.BackBufferHeight = UP._Height;
_D3DPresentParams.BackBufferFormat = UP._BackBufferFormat;
//..... fills the _D3DPresentParams..
}
-- 編集: 結論 --
何度も試行した後、ヒープ クラッシュが発生した可能性があるというエラー メッセージが表示され、Peter Ruderman が提案した原因が突き止められました。それで、動的ライブラリから静的ライブラリに変更して、その場合にそのようなヒープが発生しないようにしました(少なくともそれが私が考えていたことです)。その後、プログラムは問題なく正常に動作するように見えました。したがって、ピーターの理論は正しかったという結論になるはずです。助けてくれてありがとう。