lua — библиотека C ++ и C с использованием longjmp

Я работаю с 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 ++ обычно размещают данные в куче, которая освобождается при уничтожении объекта. Однако деструктор здесь не будет вызываться, и поэтому я думаю, что это приведет к утечке памяти. В зависимости от того, кто написал сценарий, я мог бы вызвать много ошибок и, таким образом, потерять много памяти.

Я уверен, что другим людям нужно было решить схожую проблему с этим, но я не могу найти ничего такого, чего я добиваюсь. Во многих местах говорят, что объекты не будут уничтожены, но я предполагаю, что должен быть способ обеспечить освобождение памяти?

5

Решение

Решение состоит в том, чтобы скомпилировать Lua как библиотеку C ++. затем luaL_error() вызовет исключение вместо вызова longjmp() и все будет уничтожено разматыванием стека.

7

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

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

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