2012-07-04 1 views
5

Я пишу класс строки, который похож на std :: string для домашнего задания, но я не могу понять, как вернуть c-строку, которая не вызывает утечку памяти, и гарантированно останется неизменной до тех пор, пока она не будет больше не используется. В настоящее время у меня есть:Как std :: string :: c_str() возвращает c-строку, которая не вызывает утечку памяти или неопределенное содержимое c-строки?

const char* string::c_str() 
{ 
    char c[_size+1]; 
    strncpy(c,_data,_size); 
    c[_size]='\0'; 
    return c; 
} 

, но содержимое переопределяется вскоре после его вызова. Если я выполняю динамическое распределение, у меня будет либо утечка памяти, либо только одна c-строка может существовать из заданной строки в любое время. Как я могу избежать этого?

+1

«* или только одна c-строка может существовать из заданной строки в любое время *« Так работает 'std :: string' - в чем проблема? – ildjarn

+0

Если 'strncpy()' является ответом, вы, вероятно, [задаете неправильный вопрос] (http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not- безопасней-strcpy.html). –

+0

Я не понимал, что он должен существовать только до тех пор, пока не изменится. Теперь он работает в O (1) раз. –

ответ

7

Но строка, на которую указывает c_str, только четко определена до следующего изменения (или уничтожения) std::string.

Одним из способов достижения этого может быть просто возврат указателя на внутренний буфер (при условии, что он завершен нулем). Имейте в виду, что соответствие стандарту c_str должно выполняться в течение O (1); поэтому копирование запрещено.

+1

Полезно знать. Это почти похоже на принудительное выполнение класса 'std :: string', а именно в виде массива символов. – alfC

4

От http://www.cplusplus.com/reference/string/string/c_str/:

Возвращенных точек массива на внутреннее расположение с требуемым пространства для хранения этой последовательности символов плюс ее завершающего нуля-символом, но значениями в этом массиве не должен быть изменен в программе и гарантированно останется неизменным до следующего вызовите функцию константного члена строкового объекта.

0

Буфер, возвращаемый c_str(), не гарантирует, что он останется прежним или даже действителен до тех пор, пока он больше не будет использоваться.

Гарантировано, что оно останется действительным до тех пор, пока std :: string не будет изменен.

Реализация прямолинейна: просто сохраните внутреннее представление строки с нулевым завершением и верните указатель на внутреннее представление из c_str().

 Смежные вопросы

  • Нет связанных вопросов^_^