Speicher freigeben?



  • list<char*> m_oMyList=0; // Liste aus Pointern auf Char Arrays.
    m_oMyList = new list<char*>;
    
    m_oMyList->push_back(strdup("aaaa"));
    m_oMyList->push_back(strdup("bbbb"));
    m_oMyList->push_back(strdup("cccc"));
    
    // Nun möchte ich die Liste wieder Löschen:
    if (m_oMyList) {
    	for(list<char*>::iterator pos=m_oMyList->begin(); 
    		 pos!=m_oMyList->end();
    		 pos++) {
    		cout <<pos*<<endl; // Hier wird der char* ausgegeben.
    		delete[] pos*; // Hier kommt der Fehler!
    	}
    	delete m_oMyList;
    }
    

    Fehler:
    > error C2440: 'delete' : cannot convert from 'class std::list<char *,class std::allocator<char *> >::iterator' to ''

    1. Muß ich jetzt *pos casten?
    2. Was ist eigentlich der Unterschied zw delete[] und delete? Ich habe es mir jetzt so gemerkt das delete nur bei Pointern auf ein einzelnes Objekt verwendet wird. Ich könnte demach ein einzelnes char aus einem Char Array entfernen?



  • *pos und nicht pos* zum dereferenzieren

    btw. für deinen Zweck solltest du dir vielleicht std::string oder boost.ptr_container anschauen!

    list<char*> m_oMyList=0; // Liste aus Pointern auf Char Arrays.
    

    das ist kein Pointer!



  • schlagt mich jetzt bitte nicht, aber muss man zum dereferenzieren den "*" nicht VOR den pointer schreiben ???? hat zumindest unser lehrer immer gesagt, obs nur der schönheit war oder wirklich so ist weis ich nicht, bitte korrigiert mich.

    EDIT rüdiger hat natürlich recht, das da oben iss kein pointer.



  • Vielen Dank Rüdiger und Ceos 🙂

    Aber jetzt ist es eine Liste aus Pointern (war ein Copy&Paste Fehler):
    list<char*> *m_oMyList=0;

    Ich lese Dinge per Winapi aus. Da kommt nur char* vor. Die Liste wird mir da wohl nicht erspart bleibe:
    http://www.hlrs.de/people/mueller/tutorials/script/scriptse30.html

    push_back() scheint bei std::string zu konkatenieren. Ich muß aber Strings einsammeln...



  • Außerdem ganz böse: strdup und delete zu verwenden.
    strdup allokiert den Speicher intern mit malloc() (da es eine C-Funktion ist) und daher sollte die Freigabe mit free() erfolgen.

    Aber besser ist auf jeden Fall std::string ...



  • Der Klenk schrieb:

    Ich lese Dinge per Winapi aus. Da kommt nur char* vor. Die Liste wird mir da wohl nicht erspart bleibe:
    http://www.hlrs.de/people/mueller/tutorials/script/scriptse30.html

    Tipp: Lern erst C++ und mach dann was mit WinAPI

    push_back() scheint bei std::string zu konkatenieren. Ich muß aber Strings einsammeln...

    Du sollst ja auch std::liststd::string benutzen... std::string ist ein Ersatz für char*



  • Hmm... und in Eurer C++FAQ steht das man malloc und free in C++ nicht benutzen sollte. Wenn das entfällt muß ich wirklich std::string nehmen.

    Mit der WinApi + C habe ich schon öffters gearbeitet. Das fällt mir leichter als die C++ Datenstrukturen...


Anmelden zum Antworten