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

时间:2013-10-22 19:39:41

标签: c++ vector stdvector tr1 stdbind

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

  

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

致电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());
}

我在视觉工作室2008,Windows 7下。

2 个答案:

答案 0 :(得分:4)

我和你的环境完全一样(Win7,VS 2008)。 我刚刚编译并执行了你的代码。

对我而言,您似乎必须重新创建项目,因为您可能会更改呼叫对象或类似内容:

  

配置属性&gt; C / C ++&gt;高级&gt;呼叫约定

..所以重建你的项目是最简单的检查这是否是你的问题。如果没有,我打赌你的一些头文件已损坏。

答案 1 :(得分:2)

你真的需要“stdafx.h”吗? Aka,您是否为项目预先定义了参数?因为以下适用于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”。还删除了主声明中的args,因为我不需要它们。

我在这里读到了一些可能有共同点的内容(_stdcall为_cecl调用我会相信,但我对此并不熟悉C ++)