从 std::vector c++ 调用 std::function 时崩溃
Crash when calling std::function from std::vector c++
当我这样做时,我收到此错误
运行时检查失败 #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++不远)
相关文章:
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将 lambda 表达式传递给 std::function in C++
- 模板类的部分模板专用化,如 std::function
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 从 std::function in C++ 访问模板化 lambda
- 什么是 std::function::argument_type 的替代品?
- C++派生类重载函数(带有 std::function 参数)不可见
- 如何在 qi 符号表中使用 std::function
- 将 std::function 与模板一起使用
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 我需要在 std::function 上使用 unique_ptr 吗?
- 如何将函数指针从 std::function 传递到 Linux 克隆?