Speicherloch, Ärger mit delete



  • Hallo,
    wie stopfe ich das Speicherloch? delete vor return ist ja nicht so gut und danach ist es einfach zu spät. Und es soll dynamisch bleiben.

    char *BasePath(const char *sPath)
    {
    	int	i = strlen(sPath);
    	char	*sCopy = new char[i + 1];
    
    	memcpy(sCopy, sPath, i + 1);
    
    	if(sPath[i - 1] != '\\')
    	{
    		for(; i > 0; i--)
    		{
    			if(sPath[i - 1] == '\\')
    			{
    				sCopy[i] = 0;
    				break;
    			}
    		}
    	}
    
    	return sCopy;
    }
    


  • Hallo,

    entweder du verwendest einen SmartPointer (z.B. die von der boost-lib), oder du denkst selber daran, den Speicherplatz nachdem du die Funktion verwendet hast, wieder freizugeben (kannst es auch in ne Funktion auslagern, egal):

    char *p = BasePath("Whatever");
    //mit p arbeiten
    delete [] p;
    

    MfG

    GPC



  • Das geht nicht. Entweder kopierst du es in ein Feld mit statischer Größe, die also immer gleich ist oder du gibst den Speicher nach dem Aufruf der Funktion frei.



  • Von welchem Speicherloch redest du? Der Aufrufer der Funktion muss daran denken den String mit einem delete[] wieder freizugeben, wenn du das vermeiden willst, dann verwende std::string oder std::wstring



  • GPC schrieb:

    Hallo,

    entweder du verwendest einen SmartPointer (z.B. die von der boost-lib oder std::auto_ptr)[...]

    In auto_ptr darf man keine Arrays speichern. Aber boost bietet smart-ptr für arrays an 🙂



  • Eh, stimmt. auto_ptr verwende ich nicht, deshalb der Irrtum 🙂



  • Naja, anstatt einfach std::string zu nehmen und dann kann man das auch als auto_ptr<string> zurück geben... aber man kann es sich ja auch schwer machen.



  • Artchi schrieb:

    Naja, anstatt einfach std::string zu nehmen und dann kann man das auch als auto_ptr<string> zurück geben...

    Den String kann man sogar direkt als Wert übergeben, ohne irgendwelche Pointer-Spielereien.


Anmelden zum Antworten