1

これを行うと、このエラーが発生します

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

呼び出すときdutyStack[0]();。しかし、追加dutyStack.reserve(10);した場合、またはベクトルに要素が 1 つしかない場合、エラーは発生しません。ベクトルのサイズを変更するときに要素をコピーしているときに何かが起こっていると思われますが、実際にはわかりません。

#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の下にいます。

4

2 に答える 2

2

「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++ にはあまり詳しくありません)。

于 2013-10-29T13:05:33.097 に答える