Zeiger und Gültigkeit
-
Hallo,
ich habe folgende struct:
struct AllocInfo { const char* desc; AllocInfo (const char* _desc) : desc(_desc) { } };Jetzt frage ich mich, wie ich hier Strings übergeben darf. Ich mache ja kein strcpy(), dh desc zeigt einfach nur auf den übergebenen Pointer.
// Fall 1 AllocInfo a1("foo"); // Ist das ok? Nach der Zeile zeigt a1.desc wohin? //Fall 2 { char* s = "hallo"; AllocInfo a2(s); // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc? }Fragen stehen im Code. Danke!
-
Stringliterale haben statische Speicherdauer. Beide Beispielprogramme sind äquivalent (wahrscheinlich sogar der gleiche Code).
-
//Fall 2 { char* s = "hallo"; AllocInfo a2(s); // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc? }Die Befürchtung ist hier unberechtigt, denn s zeigt wie Bashar es beschrieb, auf das unsterbliche Stringliteral.
Was gaanz anderes ist
//Fall 3 { char s[] = "hallo"; // s ist lokaler Speicher, in den gerade "hallo" kopiert wurde AllocInfo a2(s); // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc? }
-
Aber hier auch kein Problem, weil a2 keine längere Lebensdauer als s[] hat.
Wenn man da aber einen setter hätte auf ein Objekt, dass ausserhalb lebt, dann hat man ein Problem.//Fall 4 AllocInfo a2("blubb"); { char s[] = "hallo"; // s ist lokaler Speicher, in den gerade "hallo" kopiert wurde a2.set(s); // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc? } // das, worauf s zugewiesen wurde ist jetzt auch nicht mehr gültig.Der Unterschied liegt jetzt darin, dass das Beispiel hier mit dem s aus Fall 2 ok wäre, weil wie Bashar bereits vermerkt hat Stringliterale statische Lebensdauer haben.
-
Ok, danke.
Ich glaube dann habe ich in meinem Fall ein Problem
Bei mir sieht es in etwa so aus:
void MemManager::createAllocInfo(void* p, size_t size, const char* desc) { mAllocMap[p] = AllocInfo(desc); } // Aufruf irgendwo: { char c[200]; sprintf_s(c, "object %i\n", id); memManager.createAllocInfo(p, size, c); ... }Dh. ich baue den String lokal zusammen und übergebe ihn dann. Das ist jetzt problamtisch, weil c zerstört wird und es ja kein "statischer, globaler string ist" und deswegen der Zeiger in allocInfo auf ungültigen Speicher zeigt, oder?
Das kann ich eigentlich nur lösen mit einem strcpy() in AllocInfo(), oder?
-
Genau. Oder du benutzt die C++ String Klasse std::string. Die macht das nämlich für dich.