Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector在返回之前会自动清除_C++_Visual Studio 2010_Stl_Vector_Return Value - Fatal编程技术网

C++ std::vector在返回之前会自动清除

C++ std::vector在返回之前会自动清除,c++,visual-studio-2010,stl,vector,return-value,C++,Visual Studio 2010,Stl,Vector,Return Value,我有这个功能, vector<QDC::AdapterUserInfo> QDC::QueryInterface::RetrieveAdapterList() { vector<QDC::AdapterUserInfo> retVal; InnerQueryInterface::IISTATE::Transition trans = _IQI->AdapterList(retVal); if (trans._OldState == trans

我有这个功能,

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;
}
但是在发布构建中,向量总是以0大小返回。但返回的大小为1(即实际的元素数)。我在发布模式下对它进行了调试,发现
RetrieveAdapterList
函数中的
retVal
填充了实际数据,然后在函数的最后一行,即
return retVal行,它显示
retVal
向量已
清除
为空。因此,最后返回的值是一个空向量

为什么会这样?怎么了?为什么它在调试模式下工作

--编辑--

向量
aui
的析构函数似乎在继续执行到其作用域结束后失败

--来自调用者的代码--

void DXE::Screen::Initialize(窗口中的常量HWND,窗口中的常量bool)
{
QDC::UsableParameters UP;
QDC::查询接口Qui;
向量aui=Qui.RetrieveAdapterList();

如果(aui.size()这不是错误的来源。在VS2010使用的早期版本C++11中,向量是可移动构造的。在return语句中,局部变量retval成为一个rvalue,因此编译器将其内容移动到调用站点的“aui”变量中。(实际上,它只是交换aui和retval的内容。)如果您也跟踪调试构建,您应该会看到这种行为。

另一种理论:

“QDC是一个命名空间。QueryInterface是一个使用uu declspec(dllexport)导出的类。(生成带库的DLL)”


如果我理解正确,您是说函数Screen::Initialize驻留在可执行模块中,而函数QueryInterface::RetrieveAdapters列表驻留在DLL中。在这种情况下,DLL分配内存,然后将其移动到调用站点。当aui超出范围时,exe将删除内存。如果DLL和exe正在使用不同的堆,这可能会导致严重错误(堆损坏)。

你能构造一个吗?当时我正试图用一个简单的数据结构复制这个错误。如果我能复制这个错误,我会发布它。我能看到的唯一可以填充retVal的地方是
\u IQI->AdapterList(retVal)
。这个函数是引用还是指针?“我在发行版中调试了它”这几乎从来都不是一个好主意。您所展示的工作原理是:
retVal
在return语句中的任何值都是
aui
将具有的值。如果
aui
为空,则意味着
retVal
为空。在调查
retVal
如何为空之前,请确保您确定
aui
实际上为空ied(不,编译器不会自动中断程序)。如果
retVal
为空,则表示
\u IQI->AdapterList(retVal)
对它什么也没做,或者它在循环中不知怎么被清除了。调试一个调试版本并从那里检查它。问题是在调试版本中,它工作得很好。但是在发布版本中,
aui
是空的,
retVal
在函数的底部是空的。我在关闭优化并调试的情况下再次检查了它发布版本的信息。是的,听起来OP可能正在查看调试器,并在返回后检查本地
retVal
,这可能在移出函数后成为垃圾或归零内存。我猜可能是您编写的。但问题是
aui
没有显示任何元素:(@Deamonpog,您使用的是哪个版本的VS,是VS2010吗?我见过一个带有向量移动语义的bug,可能这是一个表现,也可能是另一个bug。是的,是VS2010。那个bug是什么?看起来VS2008更好:P@Deamonpog,如果您阅读我的问题的评论,您会发现一个指向Microsoft bug报告的链接:是的,它们是我从来没有想过这一点。我会看看这是不是原因。DLL有自己的堆吗?对不起,我不是很有经验。DLL是用我能用的最简单的方式编写的。它只是一堆带有大量std::set和std::vector元素的小函数。这取决于。如果DLL和应用程序ion动态链接到完全相同的CRT版本,那么它们将共享一个堆。如果它们链接到不同的版本或静态链接,那么它们将各自拥有自己的堆。那么我如何避免这种情况?通过作为引用传递?或任何其他方式?
vector<QDC::AdapterUserInfo> aui = Qui.RetrieveAdapterList();
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..
}