Где указатель, возвращаемый вызовом строки :: c_str(), указывает на? В следующем фрагменте кода я думал, что дам ошибку сегментации, но он дает мне правильный результат. Если указатель, возвращаемый строкой :: c_str(), указывает на внутреннее местоположение внутри строкового объекта, тогда, когда функция возвращается и объект-деструктор объекта вызывается, я должен получить недопустимый доступ к памяти.string :: c_str query
#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, указатель, возвращаемый 'c_str()', действителен до следующего вызова функции non-const. Поскольку 'c_str()' и 'data()' являются и самими константами, они не могут аннулировать ранее возвращенные указатели. – MSalters
@MSalters: Я тоже так думал, но: «Ссылки, указатели и итераторы, ссылающиеся на элементы последовательности« basic_string », могут быть аннулированы следующими применениями этого объекта« basic_string »: ... Вызов' data () 'и' c_str() 'функции-члены" (C++ 03 21.3/5). Я бы рассмотрел 'c_str()' как возвращающий указатель на элемент в строке, чтобы указатель _could_ был недействителен другим вызовом 'c_str()'. Я мог ошибаться. –
Я думаю, что идея в том, что basic_string может реализовать c_str(), добавив '\ 0' в свой внутренний буфер и вернув указатель на этот добавленный буфер. Такая реализация редко хранит '\ 0' и никогда не хранит две копии.Этот текст, который вы указываете, позволяет это - не указано, возвращает ли 'c_str' указатель на элементы или указатель на копию этих элементов. – MSalters