Ich schreibe eine String-Klasse, die std :: string für eine Hausaufgabe ähnlich ist, aber ich kann nicht herausfinden, wie man einen C-String zurückgibt, der kein Speicherleck verursacht und bleibt bis dahin dasselbe wird nicht mehr verwendet. Ich habe derzeit:Wie gibt std :: string :: c_str() eine C-Zeichenfolge zurück, die keinen Speicherverlust oder undefinierten C-String-Inhalt verursacht?
const char* string::c_str()
{
char c[_size+1];
strncpy(c,_data,_size);
c[_size]='\0';
return c;
}
aber die Inhalte werden kurz nach dem Aufruf außer Kraft gesetzt. Wenn ich dynamische Zuordnung mache, habe ich entweder ein Speicherleck oder nur eine C-Zeichenfolge kann von einer gegebenen Zeichenfolge jederzeit existieren. Wie kann ich das vermeiden?
"* oder nur ein C-String kann jederzeit aus einem gegebenen String bestehen *" So funktioniert 'std :: string" - was ist das Problem? – ildjarn
Wenn 'strncpy()' die Antwort ist, hast du wahrscheinlich [die falsche Frage] (http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not- safer-strcpy.html). –
Ich wusste nicht, dass es nur existieren musste, bis es geändert wurde. Es funktioniert jetzt in O (1) Zeit. –