Как очистить или уничтожить QJSEngine? - PullRequest
0 голосов
/ 11 апреля 2019

Я собираю приложение, используя Qt 5.12, где пользователи будут загружать JS-скрипты, которые взаимодействуют с приложением через его API. Эти сценарии объединены в «проекты» (т.е. несколько модулей JS, которые зависят друг от друга), и в любое время я хочу, чтобы в движок JS загружался только один проект, поэтому, если пользователь загружает другой проект, я хочу предыдущий контекст должен быть очищен.

Исходя из документации, я предположил, что если я просто удалю объект QJSEngine и создам новый, это позволит мне создать новый контекст JS.

QJSEngine* jsEngine = new QJSEngine();

// Load JS modules and run code...

jsEngine->collectGarbage();
delete jsEngine;

jsEngine = new QJSEngine();

// Load new JS modules...

Когда я пытаюсь запустить этот код, я получаю исключение нарушения доступа на delete jsEngine. Это действительно странно, потому что сама документация гласит

Мусор не собирается из постоянной кучи JS во время уничтожения QJSEngine. Если вам нужно освободить всю память, вызовите collectGarbage вручную непосредственно перед уничтожением QJSEngine.

, что для меня означало, что я должен быть в состоянии сделать это. У кого-нибудь есть идеи? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Хорошо, оказалось, что я дурачок и забыл включить одну важную деталь: мое приложение также выставляет мой объект "JavaScript-интерфейс" на движок JS, используя QJSEngine::newQObject, поэтому я просто воссоздаю этот выпуск .

Решение точно такое же: использование QQmlEngine::setObjectOwnership устраняет проблему.

0 голосов
/ 24 апреля 2019

Убедитесь, что у вас нет остатков QJSValues.

В качестве альтернативы, если вы просто хотите очистить состояние. Очистите QJSEngine :: globalObject () или просто избегайте использования корневого состояния JS, чтобы ничего не просачивалось между проектами.

...