Может ли вызов функции объединения вызвать утечку памяти

У меня была идея управлять указателями функций симметричным способом, как это делает .net, и я думаю, что, может быть, нехватка памяти, мне нужно подтверждение этого.

Когда я звоню action(5); что происходит с 5 в функции Test? По моему мнению, он остается в стеке навсегда и может привести к исключению 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;
}

2

Решение

Чтение от члена профсоюза, который не является последним записанным, приводит к неопределенному поведению.

Но чтобы ответить на ваш вопрос: это зависит от соглашение о вызовах в использовании. Более конкретно, какая часть программы отвечает за очистку стека (вызывающий или вызываемый). Если вызывающий объект очищает стек, все должно работать нормально. С другой стороны, если вызываемый должен очистить стек, вызывающий имеет поврежденный кадр стека после возврата функции. Мы надеемся, что следующий доступ к переменной, размещенной в стеке, приведет к сбою программы, или, что еще хуже, к ошибочному поведению, которое трудно отладить.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]