Это из небольшой библиотеки, которую я нашел на сайте:Возвращение «c_str» из функции
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
В моем коде я это делаю:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Теперь на первый d
содержала мусора , Затем я понял, что строка C, которую я получаю от функции, уничтожается, когда функция возвращается, потому что в стеке выделено std::ostringstream
. Поэтому я добавил:
return strdup(out.str().c_str());
И теперь я могу получить текст, который мне нужен от функции.
У меня есть два вопроса:
Могу ли я понимающих это правильно?
Я позже заметил, что
out
(типstd::ostringstream
) было выделено статическим хранилищем. Разве это не означает, что объект должен оставаться в памяти до тех пор, пока программа не завершится? И если да, то почему нельзя получить доступ к строке?
Это рискованно. Возвращаемый символ 'char *' не гарантированно будет действительным после последующего вызова 'GetHandStateBrief'. –
Верно, что каждый вызов 'GetHandStateBrief' приведет к аннулированию указателя, возвращенного предыдущим вызовом. Однако риск зависит от контекста. –
downvote за риск выстрелить себе в ногу? –