String-Funktion
-
// 1. der String auf den string zeigt, soll nun n Bytes haben
// 2. in dieser Funktion (func2) soll KEIN new / delete verwendet werdenDu musst aber new/delete verwenden, wenn string nun n Bytes belegen soll
So geht es:void SetzeString(char*& s) { delete[] s; s = new char[strlen("abcd") +1]; strcpy(s, "abcd"); }
// 3. string soll NUR in func2 Gültigkeit haben, danach soll der Speicher wieder freigegeben werden.
dann halt so:
void SetzeString(char*& s) { s = new char[strlen("abcd") +1]; strcpy(s, "abcd"); //...code... delete[] s; }
-
nein. nicht mit einem einfachen dummen pointer. entweder nimm einen smart pointer oder std::string.
-
PeterTheMaster schrieb:
nein. nicht mit einem einfachen dummen pointer. entweder nimm einen smart pointer oder std::string.
smart pointer? Was ist das?
std:string möchte ich nicht verwenden (s. weiter oben)
fit schrieb:
void SetzeString(char*& s) { s = new char[strlen("abcd") +1]; strcpy(s, "abcd"); //...code... delete[] s; }
Also die Funktion SetzeString entspricht ja der func1 in meinem vorherigen Posting. Wenn ich das jetzt aber so mache, dann wird s ja bereits in func1 zerstört. Es soll aber erst am Ende von func2 zerstört werden. Wenn ich das nun am Ende von func2 mit delete mache, dann hab ich das Problem, dass meine Funktion nicht für andere Benutzer transparent ist, denn woher sollen die wissen, dass sie auf einmal delete nach der Funktion aufrufen müssen...?
Hm... ist alles etwas schwer zu formulieren... ich hoffe, ihr versteht, wo mein Problem liegt.
-
Ja, dein Problem liegt darin, dass du in einem Traum-Universum lebst. Was du vorhast geht schlicht und einfach nicht, genauso wie 1 + 1 niemals 3 wird. Irgendwer muß ja die Verantwortung haben, den Speicher, den der String belegt, freizugeben. Das kann man entweder per Hand machen (mit delete) oder sich eine Klasse schreiben, die das im Destruktor tut (das wär dann std::string.)
-
Aso, das soll erst in funk2 gelöscht werden - habe ich falsch gelesen.
Dann machst du halt am ende von funk2 das delete[] s;Transparent ist das dann schon, denn Du gibst es ja selbst als Bedingung an:
Es soll aber erst am Ende von func2 zerstört werden
Oder anders: Programmiere in Java - da gibts einen Garbage Collector, der gibt automatisch den Speicher wieder frei, wenn die Referenzen auf das gew. Objekt nicht mehr benutzt werden und Du brauchst Dich nicht mehr um delete zu kümmern.
-
Bashar schrieb:
Ja, dein Problem liegt darin, dass du in einem Traum-Universum lebst. Was du vorhast geht schlicht und einfach nicht, genauso wie 1 + 1 niemals 3 wird. Irgendwer muß ja die Verantwortung haben, den Speicher, den der String belegt, freizugeben. Das kann man entweder per Hand machen (mit delete) oder sich eine Klasse schreiben, die das im Destruktor tut (das wär dann std::string.)
Genau das wollte ich ja nur wissen.
Wie schon gesagt, hab bisher größtenteils nur mit PHP programmiert und da geht so etwas ausgezeichnet.Aber danke, für die Mühe, die ihr euch gemacht habt!
Bloops
-
In PHP geht das überhaupt nicht, da gibts nämlich keine char-Pointer.
-
Ja eben! Da geht es noch viel einfacher mit ner ganz normalen Mir-ist-doch-egal-was-ich-für-ein-Typ-bin-Variable
-
Wieso sagst du dann, dass du die string-Klasse nicht benutzen willst?
-
Weil string nur ANSI und nicht UNICODE ist oder hab ich da nen Denkfehler...? kann auch sein.
-
ANSI? Ne, die haben damit nichts zu tun. Mit 'std::string' hast Du genau so viel oder so wenig Unicode wir mit 'char*'. Mit 'std::wstring' hast Du genau so viel oder wenig Unicode wie mit 'wchar_t*'. Beidemale muss nicht Unicode verwendet werden (auch wenn das bei den w-Dingern idR so ist. Leider galt bei Unicode lange die Devise, nur 16-bittig bleiben zu wollen. Mittlerweile wurde aber auch noch klingonisch oder ähnlich sinnhafte Zeichen aufgenommen, weswegen man derzeit bei 21 Bit rumdümpelt, die die Norm für 'wchar_t' leider nicht vorschreibt.).
-
Dann definiert man sich einen geeigneten Unicode_char und die dazugehörige char_traits-Spezialisierung, und weiter gehts.
-
Daniel E. schrieb:
ANSI? Ne, die haben damit nichts zu tun. Mit 'std::string' hast Du genau so viel oder so wenig Unicode wir mit 'char*'.
Ist mir schon klar... ich benutze ja auch nicht char* sondern TCHAR* mit entsprechenden Definitionen (petzoldgeschädigt *g*). Wollte es in meiner Frage nur nicht unnötig komplizieren.
Daniel E. schrieb:
...klingonisch...
LOL!
-
typedef std::basic_string<TCHAR> tstring;
o.ä. sollte machbar sein.