【发布时间】:2013-01-18 20:27:11
【问题描述】:
我有这个功能,
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();
但向量在 Release 版本中总是返回大小为 0。但返回大小为 1(这是元素的实际数量)。我在release模式下调试,发现RetrieveAdapterList函数里面的retVal填充的是实际数据,然后在函数的最后一行,也就是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 提出的原因。所以然后我从使用动态库更改为静态库,这样在这种情况下可能不会发生这种堆的事情(至少我是这么想的)。然后程序似乎运行良好,没有任何问题。所以结论应该是彼得的理论是正确的。谢谢大家帮忙。
【问题讨论】:
-
你能构造一个minimal test-case吗?
-
当时我试图在一个简单的数据结构中复制错误。如果我能够复制这个错误,我会发布它。
-
我能看到的唯一可以填充 retVal 的地方是
_IQI->AdapterList(retVal)。这个函数是引用还是指针? -
"我在发行版中对其进行了调试" 这几乎不是一个好主意。您所展示的有效:
retVal在 return 语句中具有的任何值都是aui将具有的。如果aui为空,则表示retVal为空。在调查retVal是如何被清空的(不,编译器不会自动破坏您的程序)之前,请确保您确定aui实际上是空的。如果retVal为空,则意味着_IQI->AdapterList(retVal);没有对其进行任何处理,或者它以某种方式在循环中被清除。调试一个调试版本并从那里检查出来。 -
问题在于,在 Debug 构建中,它运行良好。但在发布版本中,
aui为空,retVal在函数的底部被清空。我在关闭优化和调试信息的情况下仔细检查了发布版本。
标签: c++ visual-studio-2010 stl vector return-value