2

我有一个像 .net 一样管理函数指针的想法,我认为这可能是一个记忆舔我需要的构造。

当我调用action(5);函数 Test 中的 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 回答