Trường hợp con trỏ trả về bằng cách gọi chuỗi :: c_str() trỏ tới? Trong đoạn mã sau đây, tôi nghĩ rằng tôi sẽ cung cấp cho một lỗi phân đoạn nhưng nó mang lại cho tôi đầu ra chính xác. Nếu con trỏ được trả về bởi chuỗi :: c_str() trỏ đến một vị trí bên trong bên trong đối tượng chuỗi, thì khi hàm trả về và đối tượng destructor được gọi, tôi sẽ nhận được truy cập bộ nhớ không hợp lệ.chuỗi :: truy vấn c_str
#include <iostream>
#include <string>
using namespace std;
const char* func()
{
string str("test");
return str.c_str();
}
int main()
{
const char* p = func();
cout << p << endl;
return 0;
}
Output: test
Compiler: g++ 4.3.3
Platform: ubuntu 2.6.28-19
AFAICT, con trỏ được trả về bởi 'c_str()' là hợp lệ cho đến khi cuộc gọi tiếp theo đến một hàm không const. Vì 'c_str()' và 'data()' là cả hai 'const' themelves, chúng có thể không làm mất hiệu lực con trỏ trả về trước đó. – MSalters
@MSalters: Tôi cũng nghĩ như vậy, nhưng: "Tham chiếu, con trỏ và vòng lặp đề cập đến các phần tử của chuỗi' basic_string' có thể bị vô hiệu bởi các sử dụng sau của đối tượng 'basic_string': ... Gọi' dữ liệu () 'và' c_str() 'các hàm thành viên" (C++ 03 21.3/5). Tôi sẽ xem xét 'c_str()' khi trả về một con trỏ tới một phần tử trong chuỗi để con trỏ _could_ bị vô hiệu hóa bởi một lệnh gọi khác đến 'c_str()'. Tôi có thể sai về điều đó. –
Tôi nghĩ rằng ý tưởng có rằng basic_string có thể thực hiện c_str() bằng cách thêm một '\ 0' vào bộ đệm bên trong của nó, và trả về một con trỏ tới bộ đệm được nối thêm đó. Việc triển khai như vậy hiếm khi lưu trữ một '\ 0' và không bao giờ lưu trữ hai bản sao.Văn bản bạn trích dẫn cho phép điều này - nó không được chỉ định cho dù 'c_str' trả về một con trỏ tới các phần tử hoặc một con trỏ tới một bản sao của các phần tử đó. – MSalters