Wie return std::string aus der C ' s "getcwd" - Funktion
Sorry eintrichtern, aber ich versuche zu lernen :). Ist diese gut? Und ja, ich Pflege über Speicher-Lecks. Ich kann nicht finden, eine anständige Art der preallocating char*, weil es einfach zu sein scheint, keine cross-Plattform-Weg.
const string getcwd()
{
char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd);
return s_cwd;
}
UPDATE2: ohne Boost oder Qt, die die meisten gemeinsamen Sachen kann man lange-winded (siehe akzeptierte Antwort)
- Sehen rubenvb s Vorherige Frage auf diese.
- Was ist
CAKE_getcwd
? Google findet mir nichts. Plain oldgetcwd
wird nicht funktionieren, da Sie die Hoffnung auf Solaris. Obwohl es Speicher, wenn Sie übergeben Sie einen null-Zeiger, der Arbeitsspeicher weist es basiert vollständig auf der zweitengetcwd
parameter, nicht die Länge der Zeichenfolge zurückgeben möchte. Also, in deinem Beispiel, würde es zuordnen null-bytes (oder einfach nicht mit EINVAL). - CAKE_getcwd war mein workaround definieren, für die deprecation Warnung plain getcwd vs _getcwd auf Windows. Behoben
- Ich persönlich bevorzuge informativer Titel als nur "Eine Frage zu dem Thema".. wir wissen, es ist eine Frage, die wir wissen, welches Thema es ist, weil der tags, Einzelheiten sind nett 🙂
- Festen Titel und wird versuchen, mehr beschreibend in die Zukunft
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du dabei bleiben willst-standard
getcwd
ist nicht erforderlich, etwas zu tun, wenn Sie an Sie übergeben einen NULL; stattdessen sollten Sie reservieren auf dem stack einen Puffer, der ist "groß genug" für die meisten Anlässe (z.B. 255 Zeichen), aber seien Sie bereit für die Gelegenheit, in diegetcwd
fehlschlagen miterrno==ERANGE
; in diesem Fall sollte man reservieren dinamically Sie einen größeren Puffer ein, und erhöhen Sie Ihre Größe, wenn nötig.Etwas, wie das funktionieren könnte (Achtung: nicht getestet, nur geschrieben von scratch -, kann sicherlich noch verbessert):
Übrigens, in deinem code gibt es eine sehr falsche: Sie versuchen, dellocate a_cwd (die vermutlich in die nicht-Standard-Erweiterung, zugeordnet wird, die mit malloc oder mit einigen anderen Speicher-Aufteilung-Funktion, da getcwd ist gedacht für C) mit
delete
: Sie absolut nicht tun sollten, dass, im Hinterkopf behalten, dass jede aufteilungsmethode hat seine Freigabe Gegenstück, und Sie müssen nicht nicht überein.Dieser funktioniert auf Windows und Linux, da Sie beide unterstützen die automatische Zuweisung Verhalten, wenn die
buf
argumentgetcwd
NULL ist. Beachten Sie jedoch, dass dieses Verhalten ist nicht standard, so haben Sie möglicherweise Probleme, die auf die mehr esoterischen Plattformen.Du kann tun Sie es, ohne auf dieses Verhalten verlassen, wenn:
Der obige code beginnt mit einer Puffergröße von 1024, und dann, wenn
getcwd
beklagt, dass der Puffer zu klein ist, es verdoppelt die Größe und versucht wieder, und wiederholt, bis es einen ausreichend großen Puffer und erfolgreich.Beachten Sie, dass der Aufruf
realloc
mit dem ersten argument als NULL ist identisch mitmalloc
.buf = realloc(buf, ...);
ist schlecht, weil wennrealloc()
fehlschlägt, erhalten Sie einen Speicherverlust. So werden wirklich pedantisch, sollten Sie etwas wietmp = realloc(buf, ...); if (tmp) buf = tmp; else { /* handle error */ }
Du bist soll der ISO-C++ konforme version
_getcwd
denke ich. Es gibt keinen Punkt der Rückkehr eineconst string
, und Sie solltenfree
freigeben (zumindest laut MSDN):Natürlich sollten Sie auch überprüfen, ob
_getcwd()
NULL zurück.Müssen Sie nicht übergeben Sie einen null-Zeiger dem Konstruktor ein
std::string
, so müssen Sie überprüfen Sie den Zeiger auf den Puffergetcwd()
gibt nicht null ist. Auch die Zeiger auf den Puffer übergebengetcwd()
darf nicht null sein.Müssen Sie prüfen, für a_cwd NULL. Dann funktioniert es auf Mac, Windows, Linux. Jedoch, es ist nicht POSIX-konform.
EDIT: perror nicht das Programm beenden, so sollten Sie verlassen, werfen Sie eine Ausnahme, oder etwas tun.
Wie über dieses? Es ist kurz, Ausnahme sicher, und nicht Auslaufen.
result.resize(result.find('\0')-1);
und somit ist dein Ergebnis falsch ist...Als "string-Konstruktor" alles für Sie tun: