speicherlecks finden, aber wie



  • ich suche nach einer möglichkeit speicherlecks ausfindig zu machen. kennt da jemand ein programm, oä möglichkeiten?



  • Unter Windows mit Visual Studios ist sowas integriert.
    Unter Linux Valgrind.



  • Ok integriert... Sehr ausführliche Antwort. WO? Und WAS? Und wie gehts?



  • Für Visual Studio empfehle ich immer wieder den Visual Leak Detector http://www.codeproject.com/KB/applications/visualleakdetector.aspx

    schirrmie



  • Integriert, Beispiel:

    #include <crtdbg.h>
    
    #define _CRTDBG_MAP_ALLOC
    
    #define new DEBUGNEW
    #ifdef _DEBUG 
    #define DEBUGNEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #else  
    #define DEBUGNEW new 
    #endif
    
    int main()
      {            
      _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
      new char;
      }
    

    Der Charackter wird gefunden.
    Der Schmodder mit den Defines ist dazu da, dass du auch ne Angabe kriegst wo der Memoryleak ist. Das setzen der DbgFlags reicht schon aus, damit der dir sagt ob was auftritt und wie groß es is.



  • da ich gerne linux verwende, weis jemand wie man valgrind effektiv benutzt?



  • ==7079== 945,168 (228,144 direct, 717,024 indirect) bytes in 1,358 blocks are de
    finitely lost in loss record 195 of 201
    ==7079==    at 0x4C22515: operator new(unsigned long) (in /usr/lib64/valgrind/am
    d64-linux/vgpreload_memcheck.so)
    ==7079==    by 0x5350CB4: QPainter::QPainter() (in /usr/lib64/libQtGui.so.4.3.4)
    ==7079==    by 0x42BA05: BFItem::paint(QPainter*, QStyleOptionGraphicsItem const
    *, QWidget*) (Items.cpp:44)
    ==7079==    by 0x56D187A: QGraphicsScene::drawItems(QPainter*, int, QGraphicsIte
    m**, QStyleOptionGraphicsItem const*, QWidget*) (in /usr/lib64/libQtGui.so.4.3.4
    )
    

    sowas ist zb bsp. ne ausgabe bei valgrind, aber recht scher einzuordnen... anscheinend werden nur fkt. aufgezeigt in denen der fehler auftritt.

    integrierte lösungen habe ich noch nicht probiert.



  • Zeig mal deine Items.cpp BFItem::paint(...)



  • ich habs

    void BFItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    	Q_UNUSED(widget);
    
    	// Painter mit Zoll-Koordinatensystem
    	painter->setRenderHint(QPainter::Antialiasing);
    	painter->setRenderHint(QPainter::SmoothPixmapTransform);
    	//! Painter automatisch so skalieren, dass man mit den "Zoll"werten malt.
    	painter->scale(*pixels_per_inch, *pixels_per_inch);
    	// Painter mit standard Pixel-Koordinatensystem
    	QPainter px_painter; 
    // 	px_painter->setRenderHint(QPainter::Antialiasing);
    // 	px_painter->setRenderHint(QPainter::SmoothPixmapTransform);	
    
    	QPen pen;
    
    	selected = dModel->selected();
    	moving = dModel->moving();
    	turning = dModel->turning();
    	std::cout<<turning<<std::endl;
    
    	/*!
    		Modelle zeichnen
    	*/
    	drawRangeCircles(*painter, px_painter, pen);
    	/*!
    		Eiheiten zeichnen
    	*/
    	drawModel(*painter, pen, dModel->position() );
    	/*!
    		Modelle selektieren
    	*/
    	drawSelCircles(*painter, px_painter, pen);
    	/*!
    		Reichweite anzeigen
    		!es muss darauf geachtet werden, dass nur selektierte markiert werden (in der board wirds �berpr.)
    	*/
    	drawRangeCircles(*painter, px_painter, pen);
    	/*!
    		Modelle drehen
    		!es muss darauf geachtet werden, dass nur selektierte markiert werden (in der board wirds �berpr.)
    	*/
    	drawAngelGrid(*painter, px_painter);
    }
    

    das

    QPainter px_painter;
    

    sah ursprünglich so aus:

    QPainter *px_painter = new QPainter; 
    ...
    

    das hat dann dazu geführt das mit jedem paintaufruf immer mehr speicher allokiert wurde. ich denke ich werde mal die andern fehler suchen.



  • Dann hast du es ja selbst gefunden.



  • ja ich habe, als ich gelsen hate dass ich mal die cpp online stellen soll, die valgrind ausgabe durchgeschaut und in der zeile genau dieses new gesehen.
    dafür dass ich das erste mal valgrind benutzt habe, finde ich das tool richtig nützlich, leider läuft das prog im debug-modus sau lahm.



  • silent schrieb:

    ja ich habe, als ich gelsen hate dass ich mal die cpp online stellen soll, die valgrind ausgabe durchgeschaut und in der zeile genau dieses new gesehen.
    dafür dass ich das erste mal valgrind benutzt habe, finde ich das tool richtig nützlich, leider läuft das prog im debug-modus sau lahm.

    Es funktioniert nahezu perfekt. Aber halt so 15-20x langsamer als normal.



  • Wenn ich sowas schon hör... "Nahezu Optimal" Wirf den ganzen
    Dreck doch weg und nimm ne Sprache mit GC! Egal welche, ist
    alles besser als der Mist C++



  • MehrBlicker schrieb:

    Wenn ich sowas schon hör... "Nahezu Optimal" Wirf den ganzen
    Dreck doch weg und nimm ne Sprache mit GC! Egal welche, ist
    alles besser als der Mist C++

    Als "MehrBlicker" solltest du wissen, dass es auch GCs für C++ gibt oder man einfach mit Smartpointern diverser Art fast sämtliche Speicher-Schlupflöcher stopfen kann.


Anmelden zum Antworten