从 std::vector c++ 调用 std::function 时崩溃

Crash when calling std::function from std::vector c++

本文关键字:std function 崩溃 c++ vector 调用      更新时间:2023-10-16

当我这样做时,我收到此错误

运行时检查失败 #0 - 未正确保存 ESP 的值 跨函数调用。 这通常是调用 使用一个带有函数指针的调用约定声明的函数 使用不同的调用约定声明。

打电话给dutyStack[0]();时。 但是,如果我添加dutyStack.reserve(10);或者如果我在向量中只有一个元素,则不会出错。 我怀疑在调整矢量大小时复制元素时发生了什么,但我真的不知道。

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class Class1
{
public:
    void duty1(){cout<<"duty1";}
    void duty2(){cout<<"duty2";}
};
int _tmain(int argc, _TCHAR* argv[])
{
    vector<tr1::function<void()>> dutyStack;
    Class1 myclass;
    dutyStack.push_back( tr1::bind(&Class1::duty1, myclass) );
    dutyStack.push_back( tr1::bind(&Class1::duty2, myclass) );
    dutyStack[0]();
    dutyStack.erase(dutyStack.begin());
}

我在Visual Studio 2008,Windows 7下。

我有与你的完全相同的环境(Win7,VS 2008)。我刚刚编译并成功执行了您的代码。

对我来说,看起来你必须重新创建你的项目,因为你可能会有调用召集或类似东西的更改:

C/C++> 高级>调用约定>配置属性

..因此,重新创建项目非常简单,检查这是否是您的问题。如果不是这个,我敢打赌你的一些头文件已经损坏了。

你真的需要"stdafx.h"吗?另外,您的项目有预定义的参数吗?因为以下内容适用于 vs2012、vs2010:

#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class Class1
{
public:
    void duty1(){cout<<"duty1";}
    void duty2(){cout<<"duty2";}
};
int main()
{
    vector<tr1::function<void()>> dutyStack;
    Class1 myclass;
    dutyStack.push_back( tr1::bind(&Class1::duty1, myclass) );
    dutyStack.push_back( tr1::bind(&Class1::duty2, myclass));
    dutyStack[0]();
    dutyStack.erase(dutyStack.begin());
    system("pause");
    return 0;
}

请注意,我删除了"stdafx.h"并将"_tmain"重命名为"main"。还删除了主声明中的参数,因为我在那里不需要它们。

我在这里读到了一些可能有一些共同点的东西(_stdcall我相信_cecl,但我对此C++不远)