Đây là từ một thư viện nhỏ mà tôi tìm thấy trực tuyến:Trở lại 'c_str' từ một hàm
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
Trong mã của tôi, tôi đang làm điều này:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Bây giờ, lúc đầu d
chứa rác . Sau đó tôi nhận ra rằng chuỗi C tôi nhận được từ hàm bị hủy khi hàm trả về vì std::ostringstream
được cấp phát trên ngăn xếp. Vì vậy, tôi đã thêm:
return strdup(out.str().c_str());
Và bây giờ tôi có thể nhận được văn bản tôi cần từ hàm.
Tôi có hai câu hỏi:
Tôi hiểu điều này một cách chính xác?
Sau đó tôi nhận thấy rằng
out
(loạistd::ostringstream
) được cấp phát bằng bộ nhớ tĩnh. Điều đó không có nghĩa là đối tượng được cho là phải ở trong bộ nhớ cho đến khi chương trình kết thúc? Và nếu có thì tại sao chuỗi không thể truy cập được?
Điều này rất nguy hiểm. Trả về 'char *' không được bảo đảm là hợp lệ sau một cuộc gọi tiếp theo tới 'GetHandStateBrief'. –
Đúng là mọi lời gọi đến 'GetHandStateBrief' sẽ làm mất hiệu lực con trỏ được trả về bởi cuộc gọi trước đó. Nguy cơ là bối cảnh phụ thuộc mặc dù. –
downvote cho nguy cơ bắn mình vào chân? –