Я изучаю, как интегрировать полную поддержку сценариев в мое приложение, но у меня возникла небольшая проблема, когда я планирую, чтобы мой C API был дружественным по отношению к LUA.
В основном я получил кучу структур, которые создаются через init и free
функции как это:
[test.h]
typedef struct
{
char name[ 50 ];
} Test;
Test *TestAdd( char *name );
Test *TestDelete( Test *test );
[test.c]
Test *TestAdd( char *name )
{
Test *test = ( Test * ) calloc( 1, sizeof( Test ) );
strcpy( test->name, name );
return test;
}
Test *TestDelete( Test *test )
{
free( test );
return NULL;
}
Я использую swig для генерации модуля LUA, поэтому я создаю следующий файл интерфейса:
[test.i]
%module test
%{
%}
Test *TestAdd( char *name );
Test *TestDelete( Test * test );
Все работает нормально, если код пользователя такой:
a = test.TestAdd( "test" )
a = test.TestDelete( a )
if( a != nil ) print( a.name )
Но если код пользователя такой:
a = test.TestAdd( "test" )
test.TestDelete( a )
if( a != nil ) print( a.name ) -- Crash the app with bad_access (not just a LuaVM error).
Или даже хуже:
a = test.TestAdd( "test" )
test.TestDelete( a )
test.TestDelete( a )
-- Another way of making crash my app completely!
Есть ли какой-нибудь способ, которым я могу создать набор API в C, который бы избежал такого рода проблем и позволил бы пользователю безопасно добавлять / удалять и обращаться к свойствам безопасным способом, который не создавал бы ошибку "плохого доступа" и сбой всей программы, лучше всего, если LUAVM просто вернет ошибку и выполнение продолжится.
Я искал и пробовал другой подход к моему C API, чтобы избежать этой проблемы, но не смог ...
Кто-нибудь может мне помочь или дать несколько советов о том, как это сделать.
Заранее спасибо,