Problem mit Rückgabewert "string_val"



  • Hollo,
    nun mal sachlich bleiben.
    Bezieht sich der Hinweis "Memory Leak" auf das fehlende "free() oder wie kann ich das vermeiden?
    Mein Programm hat keinen "Memory Leak" angezeigt.
    Einen besseren Hinweis als nur "Memory Leak" könntet ihr mir schon geben denn dazu ist ja meiner Meinung nach solch ein Forum da.
    Oder sind solche User wie "Martin Richter" und "EOP" nur da um Punkte oder was weiss ich zu sammelen.
    Da lobe ich mir doch den Beitrag von "theta" (vielen Dank dafür).

    MfG

    Juergen B.
    😕



  • Natürlich bezieht es sich auf das fehlende free().

    Wobei ich kompetenztechnisch in keinster Weise an Martin Richter rankomme.
    Wer keine Ahnung hat sollte einfach auch mal die Klappe halten.


  • Mod

    jbaben schrieb:

    Hollo,
    nun mal sachlich bleiben.

    War ich unhöflich!

    Oder sind solche User wie "Martin Richter" und "EOP" nur da um Punkte oder was weiss ich zu sammelen.

    1. Aus dem Alter bin ich raus.
    2. Du willst lernen (hast Du selbst geschrieben), also schreibe ich nicht die direkte Lösung für das Problem.
    Du darfst selbst den Bereich zwischen Deinen Ohren einschalten. 🤡
    Wenn das nicht reicht. Mach den Mund auf und frage...
    3. Wenn ein Programm keine Leaks anzeigt liegt es vielleicht an Dir, weil Du es nicht so programmiert hast, dass es solche anzeigen könnte.
    Siehe auch
    https://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.90).aspx

    PS: Ich bilde seit ca. 25 Jahren Leute im Bereich des Programmierens aus... wie soll man lernen wenn man gleich alle Fehler auf dem Tablet präsentiert bekommt.
    Würdest Du bei mir ausgebildet werden hätte ich erwartet:
    1. Du machst Dich klug was ein "Memory Leak" ist. Ich habe es netter Weise in Quotes geschrieben.
    2. Bei der gegebenen Programmiersprache kümmerst Du Dich Darum wie solch ein Problem aussieht.
    3. Du entdeckst selbst in Deinem Code, was 2. bedeutet.
    4. Du sagst "Danke, o Meister!"

    4. Ist optional. 😃



  • Das erste Mal, dass ich Martin Richter aufgebracht sehe. 👍


  • Mod

    EOP schrieb:

    Das erste Mal, dass ich Martin Richter aufgebracht sehe. 👍

    Aufgebracht, war ich wirklich nicht!
    Auch aus dem Alter bin ich raus...
    Ich habe nur jbaben nicht verstanden und er mich scheinbar auch nicht, also gilt es Unklarheiten gleich zu beseitigen. 😃



  • Zu dem Thema hätte ich noch eine Frage:
    Wieso funktioniert std::string eigentlich als Rückgabewert?
    Ist doch im Prinzip auch nur eine lokale Variable auf dem stack. 😕


  • Mod

    EOP schrieb:

    Wieso funktioniert std::string eigentlich als Rückgabewert?
    Ist doch im Prinzip auch nur eine lokale Variable auf dem stack. 😕

    Eben es ist ein temporäres Objekt auf dem Stack, und existiert solange, der dazugehörige Ausdruck im Scope liegt.
    Dann wird er dazugehörige Destruktor aufgerufen.

    Und wenn Deine Frage abzielt, wie etwas, dass größer ist als ein Register zurück gegeben werden kann:
    Der Aufrufer stellt den Stack Bereich zur Verfügung, in den der Rückgabewert passen soll, diese Adresse wird übergeben, die Funktion füllt diesen.

    Aber meine Zeiten aus dem Compilerbau sind lange her... das erklärt ein anderer evtl. besser.



  • Danke erstmal für die Antwort. Meine Assembler-Zeiten sind auch schon etwas länger her. Mindestens 25 Jahre. Aber jetzt wo du es sagst fallen mir wieder verschiedene Sachen ein.



  • Hallo,

    1. ich denke ich bin hier im richtigen Forum.
    2. Meine Aussage: "nun mal sachlich bleiben" beziehst sich auf mich.
    3. ich denke das Problem mit "Memory Leak" war das ich mit "delete szName" und "free(szName)" eine "Ausgelöste Ausnahme Lesezugriffsverletzung ('it' war '0x811E') erhalten habe. ohne "delete szName" --> Ok
    4. Das Bispiel von "theta" funktioniert bei mir unter "Visual Studio Express 2015) nicht.
    In der Zeile " auto size = GetPrivateProfileString(section.c_str(), key.c_str(), default_value.c_str(), &value[0], value.size(), file_name.c_str());" erhalte ich
    "error C2664: "DWORD GetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD,LPCWSTR)" : Konvertierung von Argument 1 von "const char *" in "LPCWSTR" nicht möglich"

    MfG

    Juergen B.
    😕


  • Mod

    zu 1. Na dann
    zu 2. Aha
    zu 3. Doch!
    zu 4.
    Schau Dir die Meldung an. Dein Projekt hast Du als Unicode Projekt compiliert.
    Folge: Alle Funktionen wie GetPrivateProfileString, werden auf die Unicode Variante gemappt, hier also GetPrivateProfileStringW!

    Folge: Die Funktion nimmt keine char* wie die GetPrivateProfileStringA, sondenr nur wchar_t*.

    Also entweder Unicode abschalten oder die richtigen (passenden) Typen verwenden, oder universell mit TCHAR arbeiten.



  • Hallo,

    vielen Dank für den Hinweis auf UNICODE.
    Wenn ich den UNICODE ausschalte funktioniert das Beispiel von "theta".
    Das mit dem Hinweis auf "wchar_t*" habe ich ja in meinem Ausgangs Programm-Code verwendet.

    Ich meine nun ist erst einmal zu meinem eigentlich Problem alles gesagt.
    Mein nächstes Problem werde ich dann in einem neuen Beitrag senden.

    Ach, eins noch: könntet ihr mir noch ein gutes C++-Buch empfehlen ?

    MfG

    Juergen B.
    :p



  • Martin Richter schrieb:

    oder universell mit TCHAR arbeiten.

    That's the way to go.
    Ich hatte vor ein paar Jahren schon mal eine Frage, wie ich ein Programm auch für Win98 lauffähig mache. Du und Jochen Kalmbach haben mir dabei sehr geholfen.
    Da ich schon alle strings in _T("string") gepackt hatte, musste ich im ganzen Programm lediglich eine einzige Zeile ändern (war glaube ich irgendwas mit strcmp). Danke noch einmal.



  • Ich würde empfehle TCHAR nicht zu verwenden. Auf Support für pre-NT Windosen kann man glaube ich heutzutage so-gut-wie überall verzichten. Und wer es nicht kann, weiss normalerweise genau dass und warum er es nicht kann.



  • Martin Richter schrieb:

    Und wenn Deine Frage abzielt, wie etwas, dass größer ist als ein Register zurück gegeben werden kann:
    Der Aufrufer stellt den Stack Bereich zur Verfügung, in den der Rückgabewert passen soll, diese Adresse wird übergeben, die Funktion füllt diesen.

    Aber meine Zeiten aus dem Compilerbau sind lange her... das erklärt ein anderer evtl. besser.

    Das ist eine recht übliche Variante. Bei amd64 werden aber üblicherweise kleine Objekte in mehreren Registern zurückgegeben (max. 2 Register). Geht aber natürlich nur wenn sie trivial kopier- und zerstörbar sind.
    Bei grösseren bzw. nicht-trivial dann so wie du geschrieben hast.

    https://godbolt.org/g/XnhbDA

    Andere Implementierung ist mir keine bekannt. Bin aber auch kein Compilerbauer 🙂


  • Mod

    hustbaer schrieb:

    Ich würde empfehle TCHAR nicht zu verwenden. Auf Support für pre-NT Windosen kann man glaube ich heutzutage so-gut-wie überall verzichten. Und wer es nicht kann, weiss normalerweise genau dass und warum er es nicht kann.

    Also ich nutze es immer noch gerne für meinen Standardcode

    Der Grund ist einfach: Wie oft bekomme ich irgendeinen Code, der nur char* kann und mag. Dennoch will ich ohne Umwege oder Komplexität das Tool nutzen. TCHAR erlaubt mir jederzeit auch meinen aktuellen Code schnell mal an "altes" anzupassen. Und Mehraufwand ist es nicht.

    Ansonsten schreibe ich nur noch für Vista und und ab November für Windows 7 und später... also gäbe "Support-Technisch" für mich auch keinen Grund.

    Wenn ich mich komplett umstellen würde, dann würde ich alle auch Funktionen nur noch mit W Extension verwenden...

    Es wirkt für mich komisch GetWindowText zu schreiben und Unicode voraus zu setzen. Aber vermutlich nur einfach ungewohnt.



  • Martin Richter schrieb:

    hustbaer schrieb:

    Ich würde empfehle TCHAR nicht zu verwenden. Auf Support für pre-NT Windosen kann man glaube ich heutzutage so-gut-wie überall verzichten. Und wer es nicht kann, weiss normalerweise genau dass und warum er es nicht kann.

    Also ich nutze es immer noch gerne für meinen Standardcode

    Der Grund ist einfach: Wie oft bekomme ich irgendeinen Code, der nur char* kann und mag. Dennoch will ich ohne Umwege oder Komplexität das Tool nutzen. TCHAR erlaubt mir jederzeit auch meinen aktuellen Code schnell mal an "altes" anzupassen. Und Mehraufwand ist es nicht.

    Du bist ein alter Hase und weisst wie man den Code schreiben muss damit es dann auch wirklich funktioniert wenn man später mal eine MBCS Version bauen will. Wenn Leute für die das TCHAR Thema neu ist Code schreiben, kommt dabei niemals im Leben 'was raus was dann auch wirklich baut geschweige denn fehlerfrei läuft wenn man auf MBCS umstellt. Dann lieber gleich alles mit wchar_t.

    Martin Richter schrieb:

    Ansonsten schreibe ich nur noch für Vista und und ab November für Windows 7 und später... also gäbe "Support-Technisch" für mich auch keinen Grund.

    Wenn ich mich komplett umstellen würde, dann würde ich alle auch Funktionen nur noch mit W Extension verwenden...

    Es wirkt für mich komisch GetWindowText zu schreiben und Unicode voraus zu setzen. Aber vermutlich nur einfach ungewohnt.

    Ja, genau. Also zumindest ich mache es so. Also überall direkt die W Versionen aufrufen und die _W structs verwenden etc. Im Prinzip alles was von der Projekteinstellung UNICODE vs. MBCS abhängig ist verwende ich nicht, sondern direkt die "W" Varianten. Es sei denn ich übersehe wieder mal was.


Anmelden zum Antworten