Собственно ситуация такая: у меня есть библиотека для 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 в котором просто вызывается деструктор условного вектора. Он отрабатывает по завершению всего скрипта
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости