Перемещение данных между lua и c++

95
09 декабря 2021, 19:20

Собственно ситуация такая: у меня есть библиотека для lua (написана на c++) которая предоставляет доступ к некоему объекту из c++ кода (допустим, вектору). При этом этот объект аллоцирует память в куче, а сам объект я размещаю в userdata lua, примерно так:

std::vector<int> *buf = reinterpret_cast<std::vector<int> *>(lua_newuserdata(state, sizeof(std::vector<int>)));
new (buf) std::vector<int>(10);

Помните: то, что выше - это вызов C++ из Lua! Когда я вызываю из C++(!) скрипт на lua, который возвращает мне подобный объект (userdata с размещенным в нем std::vector) в с++ я произвожу нечто подобное:

std::vector<int> out;
auto *vec = reinterpret_cast<std::vector<int>*>lua_touserdata(state, -1));
if (vec) {
  out = std::move(*out);
}

Как видите, я использую move чтобы избежать ненужного копирования. Так вот, все вроде работало прекрастно, пока не потребовалось собрать прилагу под windows. В результате я начал получать segmentation fault из-за того, что out был поврежден. Как-будто, несмотря на move данные выделенные в куче были освобождены по выходу из скрипта. Собственно вопрос: насколько безопасно перемещать таким образом данные?

PS lua-5.1.5

PSS также забыл упомянуть, что для избежания утечек памяти объекту в lua был добавлен метод __gc в котором просто вызывается деструктор условного вектора. Он отрабатывает по завершению всего скрипта

READ ALSO
Как остановить бесконечный поток из нового диалогового окна

Как остановить бесконечный поток из нового диалогового окна

Запустил бесконечный поток из окна mainwindowСоздал диалоговое окно menu по нажатию на кнопку мне нужно остановить бесконечный поток

153
Как сравнить значения из вектора структур

Как сравнить значения из вектора структур

Всем еще раз здрасте)Сейчас попробую более дитально описать проблему

206
Вычисление суммы ряда

Вычисление суммы ряда

мне нужно сделать код так, чтобы получился пример под цифрой 2 но код я смог сделать только так, что у меня получается пример под цифрой 1 Как...

239