Как я могу позволить lua стать владельцем возвращаемого значения при использовании tolua++?

Вот мой код C++:

// tolua_begin
const char* GetSomeString() {
    std::string result;
    // do something
    return result.c_str();
}
// tolua_end

Я знаю, когда функция вернется, result будет освобожден, и Луа ничего не получит, если я назову это Луа. я нуждаюсь new Тот, кто запретил ему быть освобожденным. Но это приведет к утечке памяти. Поэтому я должен позволить Луа взять на себя ответственность за возвращаемое значение.

Я знаю как это сделать используя lua_State, Но я использую комментарий, чтобы раскрыть свои функции C++ для lua, поэтому мне интересно, есть ли подобный способ добиться этого?

1 ответ

Решение

Это не имеет ничего общего с вашей привязкой к Луа. Когда вы возвращаетесь из функции, результирующая строка уничтожается, и указатель, указывающий на ее внутренний буфер, будет указывать на освобожденную память. Нет никакого момента, когда у библиотеки есть шанс стать владельцем этой строки, потому что в конечном итоге она просто выполняет вызов функции, и результат становится доступным только после того, как функция вернулась (к этому времени она не может использоваться). После беглого поиска в гугле я думаю, что tolua++ поддерживает std::string вернуть значения, чтобы вы могли сделать это:

// tolua_begin
std::string GetSomeString() {
    std::string result;
    // do something
    return result;
}
// tolua_end

Это будет работать, потому что строка скопирована.

Другие вопросы по тегам