пробую создать приложение c++, которое умеет выполнять lisp код. Для интеграции использую Embeddable Common LISP
Абстрактный пример
код на лисп:
(setq my_class (create-myclass))
будет вызывать код в c++:
cl_object create_my_class()
{
MyClass* myClass = new MyClass;
return (cl_object)myClass;
}
Лисп - переменная my_class в c++ будет соответствовать указателю на MyClass*
Но есть проблема.
(setq my_class nil)
(gc)
не освобождает память указателю на MyClass* в c++
Для решения проблемы можно создать лисп функцию
(delete-myclass my_class)
Которой будет соответствовать вот такой код в c++:
cl_object delete_myclass(cl_object my_class)
{
MyClass* myClass = (MyClass*)my_class;
delete myClass;
return Cnil;
}
Но тут возникает проблема.
В отладчике cl_object my_class и MyClass* myClass имеют один и тот же адрес.

Это значит delete myClass; освобождает и cl_object my_class. То есть вместе с ними переменная в лисп получает неопределённое значение.
Возникает вопрос что будет если в лиспе GC пройдет по переменной my_class если в c++ был удален её cl_object?
Нигде не нашел информации по этой теме.
В Debug режиме c++ ошибки подобного рода могут и не возникать. А вот в релизной версии мне кажется GC лиспа может совершить Access Violation если данные lisp переменной были удалены или совершить double delete.
Защищена ли эта система интеграции от double delete?