Kann vorher reservierten Speicherblock nicht freen



  • Tag zusammen.

    Folgende Situation:
    Ich habe eine Member-Funktion, welche Speicher für einen übergebenen Pointer anlegt und mit Daten füllt.
    Da dieser Speicherblock nun in der Funktion selbst nicht mehr gefreed wird, muss ich das - logischerweise - von Außerhalb tun. Doch das schlägt leider fehl.

    Hier mein Funktionskopf:

    void CTargetList::GetTarget(unsigned long targetid, char *&host, char *&path)
    

    host und path sollen also den Pointer zum Speicher bekommen.

    ...
    	host = (char*)malloc(hostlen);
    	path = (char*)malloc(pathlen+1);
    ...
    

    Hier wird dann der Speicher (innerhalb der obigen Funktion) reserviert. In der main()-Funktion sieht's nun so aus:

    char *host, *path;
    
    	targetlist.GetTarget(0, host, path);
    	printf("Host: %s Path: %s\n", host, path);
    
    	free(host);
    	free(path);
    

    Nun frage ich mich, wieso ein Fehler beim free()-Call auftritt (ohne die Calls läuft's einwandfrei. Ich denke aber, dass dadurch Leaks entstehen). Fehlermeldung während der Lauzeit ist "DAMAGE: After normal block".

    Gehe ich die Sache falsch an oder brauche ich aus irgendwelchen Gründen die Blöcke nicht wieder freigeben? Wäre ja eigenartig, aber man weiß ja nie. 😉

    MfG
    Nox



  • Wieso benutzt du malloc/free mit C++?

    Ich würde zuerst so machen:

    void CTargetList::GetTarget(unsigned long targetid, char** host, char** path);
    

    und dann so aufrufen:

    char* host, *path;
    ...
    targetlist.GetTarget(0, &host, &path);
    


  • supertux schrieb:

    Wieso benutzt du malloc/free mit C++?

    also: eigendlich befinden wir uns doch im ANSI C Forum! 😃

    mfG (c)h



  • Erstmal schönen Dank für die Antwort, werde es nachher mal probieren.
    Und ein Sorry, dass ich es im ANSI C-Forum gepostet hatte...Klassen gehören da ja eigentlich nicht so wirklich zu. 😉



  • Wozu überhaupt ** ein * reicht hier doch vollkommen, oder überseh ich da was



  • ** ist ein pointer auf deine übergebenen pointer. das ist ne andere möglichkeit neben referenzen.


Anmelden zum Antworten