障害が発生した場合にクリーンアップする必要があるリソースを割り当てた後、 lua_pushstring を使用したい場合があります。ただし、ドキュメントが暗示しているように見えるように、 lua_push* 関数は常にメモリ不足の例外で終了する可能性があります。しかし、その例外は私の C スコープを即座に終了し、エラーの場合に解放する必要があるかもしれない一時的に割り当てた可能性のあるものをクリーンアップすることを許可しません。
状況を説明するコード例:
void* blubb = malloc(20);
...some other things happening here...
lua_pushstring(L, "test"); //how to do this call safely so I can still take care of blubb?
...possibly more things going on here...
free(blubb);
そのような例外が発生するかどうかを事前に確認し、自分のリソースを安全にクリーンアップしたらすぐにプッシュして自分のエラーをトリガーするのを避ける方法はありますか? または、どうにかして setjmp を非アクティブ化し、プッシュを行った後に「魔法の変数」をチェックして、実際に機能したか、エラーが発生したかを確認できますか?
自分の関数をpcallすることも考えましたが、pcallで安全に呼び出したい関数をスタックにプッシュしただけでも、メモリ不足になる可能性がありますね。
明確にするために、Lua が過剰なメモリを割り当てるのを防ぐカスタム メモリ アロケータと組み合わせて使用することを具体的にお願いしているので、システム全体でメモリが不足している場合ではないと仮定します。