2

私は.netと同じように関数ポインタを管理するという考えを持っていましたが、おそらくメモリリックが必要だと思います。

action(5);関数テストで5はどうなりますか?私の意見では、それは永遠にスタックにとどまり、stackoverflow例外として発生する可能性があります

#include <iostream>
union Action
{
    void (*action)();
    void (*action1)(int);

    void operator()(int i)
    {
        this->action1(i);
    }
    void operator=(void (*action)())
    {
        this->action = action;
    }
    void operator=(void (*action)(int))
    {
        this->action1 = action;
    }
};
void Test()
{
    std::cout << "test";
}
int main()
{
    Action action;
    action = Test;

    action(5);

    char c;
    std::cin >> c;
}
4

1 に答える 1

3

最後に書き込まれたものではない共用体メンバーから読み取ると、未定義の動作が発生します。

しかし、あなたの質問に答えるには、使用中の呼び出し規約に依存します。より具体的には、プログラムのどの部分がスタックのクリーンアップを担当しているか (呼び出し元と呼び出し先)。呼び出し元がスタックをクリーンアップすると、すべてが正常に機能するはずです。一方、呼び出し先がスタックをクリーンアップする必要がある場合、呼び出し元は、関数が返された後に壊れたスタック フレームを持っています。スタックに割り当てられた変数に次にアクセスすると、プログラムがクラッシュすることが期待されます。さらに悪いことに、デバッグが困難な不安定な動作しか発生しません。

于 2012-09-23T14:15:38.270 に答える