thể trùng lặp:
Lifetime of temporariesGiá trị tham số tạm thời nằm ngoài phạm vi khi nào?
int LegacyFunction(const char *s) {
// do something with s, like print it to standard output
// this function does NOT retain any pointer to s after it returns.
return strlen(s);
}
std::string ModernFunction() {
// do something that returns a string
return "Hello";
}
LegacyFunction(ModernFunction().c_str());
Ví dụ trên có thể dễ dàng được viết lại để sử dụng con trỏ thông minh thay vì chuỗi; Tôi đã gặp phải cả hai tình huống này nhiều lần. Dù sao, ví dụ trên sẽ xây dựng một chuỗi STL trong ModernFunction, trả về nó, sau đó nhận một con trỏ tới một chuỗi kiểu C bên trong đối tượng chuỗi, và sau đó chuyển con trỏ đó tới hàm kế thừa.
- Có một đối tượng chuỗi tạm thời tồn tại sau khi ModernFunction đã trả về. Khi nào nó ra khỏi phạm vi?
- Có thể cho trình biên dịch gọi c_str(), hủy đối tượng chuỗi tạm thời này và sau đó truyền con trỏ trỏ đến LegacyFunction không? (Hãy nhớ rằng đối tượng chuỗi đang quản lý bộ nhớ mà c_str() trả về các giá trị cho ...)
- Nếu mã trên không an toàn, tại sao nó không an toàn và có cách viết ngắn gọn hơn nó hơn là thêm một biến tạm thời khi thực hiện các cuộc gọi hàm? Nếu nó an toàn, tại sao?
Tôi vừa biên soạn và nó hoạt động. Nó cũng sẽ hoạt động, theo câu trả lời của ForEveR. –
@ H2CO3, "nó hoạt động" không bao giờ chứng minh bất cứ điều gì - đôi khi bạn chỉ nhận được may mắn. Nếu bạn đã thử nó và nó * không * làm việc, điều đó sẽ khác. –
@MarkRansom nhận thấy "Nó cũng sẽ hoạt động, theo phần trả lời của ForEveR"? (để làm rõ: Tôi biết điều đó.) –