Я работаю с Lua, у которого есть C API, и функции сбора ошибок используют longjmps. При возникновении ошибки я сначала создаю сообщение, описывающее, что пошло не так, а затем говорю Луа поднять ошибку. Например
std::stringstream ss;
ss << "'" << function->cb->name << "' expects at most " << maxargs_all
<< " argument(s) and received " << nargs;
luaL_error(L, ss.str().c_str());
Я понимаю, что longjmp не размотает стек, и поэтому мой stringstream
объект не будет уничтожен. Если я правильно помню, stringstream
и другие классы библиотеки C ++ обычно размещают данные в куче, которая освобождается при уничтожении объекта. Однако деструктор здесь не будет вызываться, и поэтому я думаю, что это приведет к утечке памяти. В зависимости от того, кто написал сценарий, я мог бы вызвать много ошибок и, таким образом, потерять много памяти.
Я уверен, что другим людям нужно было решить схожую проблему с этим, но я не могу найти ничего такого, чего я добиваюсь. Во многих местах говорят, что объекты не будут уничтожены, но я предполагаю, что должен быть способ обеспечить освобождение памяти?
Решение состоит в том, чтобы скомпилировать Lua как библиотеку C ++. затем luaL_error()
вызовет исключение вместо вызова longjmp()
и все будет уничтожено разматыванием стека.
Других решений пока нет …