map/priority queue: speicher freigeben?



  • hallo,

    mein programm scheint noch ein paar memory leaks zu haben, wobei mir eine map und eine priority queue verdächtig erscheinen.
    deshalb habe ich 2 kurze fragen:

    bei einer map "m_code": gibt
    m_code.erase(m_code.begin(),m_code.end());
    den benutzten speicher wieder frei?

    bei einer priority queue "m_knotQueue":
    gibt
    while (!m_knotQueue.empty())
    m_knotQueue.pop();
    den benutzten speicher wieder frei?

    das war's auch schon, danke!

    martin



  • inspire schrieb:

    hallo,

    mein programm scheint noch ein paar memory leaks zu haben, wobei mir eine map und eine priority queue verdächtig erscheinen.
    deshalb habe ich 2 kurze fragen:

    bei einer map "m_code": gibt
    m_code.erase(m_code.begin(),m_code.end());
    den benutzten speicher wieder frei?

    bei einer priority queue "m_knotQueue":
    gibt
    while (!m_knotQueue.empty())
    m_knotQueue.pop();
    den benutzten speicher wieder frei?

    das war's auch schon, danke!

    martin

    der direkt benutzte Speicher wird wieder freigegeben. Wenn du allerdings Pointer auf irgendwelche Objekte in den Containern speicherst, wird auf diese Pointer kein delete aufgerufen, d.h. du musst den Speicher der Objekte selber freigeben.

    Wie kommst du drauf dass dein Programm memory leaks hat? Wenn du sie nicht im Code siehst kann dir das eigentlich nur ein Analyseprogramm zuverlässig sagen, und das wird dann acuh gleich erzählen wo das Leck ist.
    Der Taskmanager von Windows ist keine zuverlässige Anzeige was den tatsächlichen Speicherverbrauch angeht!



  • Wenn deine map Pointer beinhaltet, reicht ein erase nicht aus, denn ein delete auf die Pointer wird nicht ausgeführt.



  • ah danke euch, alles klar! 🙂



  • Fellhuhn schrieb:

    Wenn deine map Pointer beinhaltet, reicht ein erase nicht aus, denn ein delete auf die Pointer wird nicht ausgeführt.

    Das delete muss man natürlich nicht bei allen Zeigern ausführen, sondern nur bei besitzenden. Und in dem Falle rät es sich, gleich selbstverwaltende Klassen wie boost::ptr_map zu verwenden.


Log in to reply