【问题标题】:Crash when calling std::function from std::vector c++从 std::vector c++ 调用 std::function 时崩溃
【发布时间】:2013-10-22 19:39:41
【问题描述】:

当我这样做时,我得到了这个错误

运行时检查失败 #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 下。

【问题讨论】:

  • 你应该提到操作系统等环境
  • 你能提供一个SSCCE吗?
  • 似乎在 VS 2012 上运行良好
  • 该代码看起来不错,只是我预计 tr1 标头是 &lt;tr1/functional&gt;
  • 在运行之前一切正常。

标签: c++ vector stdvector tr1 stdbind


【解决方案1】:

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

对我来说,您似乎必须重新创建您的项目,因为您可能需要更改调用 convension 或类似的东西:

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

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

【讨论】:

  • 我没有测试它,但这就是我阅读问题时的想法。好干净的回应。提问者的未来阅读blogs.msdn.com/b/oldnewthing/archive/2004/01/08/48616.aspx
  • 也适用于 VS2013。示例看起来不错,但实际项目却不行。
  • 似乎有道理,我们最近在项目中发生了一些变化,我会尽快看看能不能做点什么。
【解决方案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++ 的了解并不远)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多