Задать вопрос
@maxcad

Как управлять памятью в интеграции Embeddable Common LISP и с++?

пробую создать приложение 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 имеют один и тот же адрес.
688673eb9bc0a886158180.pngЭто значит delete myClass; освобождает и cl_object my_class. То есть вместе с ними переменная в лисп получает неопределённое значение.

Возникает вопрос что будет если в лиспе GC пройдет по переменной my_class если в c++ был удален её cl_object?
Нигде не нашел информации по этой теме.

В Debug режиме c++ ошибки подобного рода могут и не возникать. А вот в релизной версии мне кажется GC лиспа может совершить Access Violation если данные lisp переменной были удалены или совершить double delete.

Защищена ли эта система интеграции от double delete?
  • Вопрос задан
  • 12 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы