Unsicher bzgl. Speicheranforderung und Freigabe



  • Hallo!

    Ich versuche ein Stück OpenCv-Code in C in C++ umzuschreiben.
    Hier das Original:

    int npts[2] = { 3, 5 };
              CvPoint **pts;
    
              pts = (CvPoint **) cvAlloc (sizeof (CvPoint *) * 2);
              pts[0] = (CvPoint *) cvAlloc (sizeof (CvPoint) * 3);
              pts[1] = (CvPoint *) cvAlloc (sizeof (CvPoint) * 5);
    
              pts[0][0].x = 50;
              pts[0][0].y = 210;
              pts[0][1].x = 10;
              pts[0][1].y = 280;
              pts[0][2].x = 90;
              pts[0][2].y = 285;
              pts[1][0].x = 260;
              pts[1][0].y = 180;
              pts[1][1].x = 198;
              pts[1][1].y = 201;
              pts[1][2].x = 198;
              pts[1][2].y = 270;
              pts[1][3].x = 265;
              pts[1][3].y = 280;
              pts[1][4].x = 290;
              pts[1][4].y = 220;
    
              cvPolyLine( m_ipl, pts, npts, 2, true,CV_RGB(0,0,255), 2,    8, 0 );
    

    Hier wird kein Speicher freigegeben und in der Doku von cvPolyLine steht auch nicht, dass er in der Funktion freigegeben wird. Also wäre meine Variante:

    int npts[2] = { 3, 5 };
              CvPoint **pts;
    
              pts = new CvPoint*[2];           
              pts[0] = new CvPoint[3];
              pts[1] =  new CvPoint[5];
    
              pts[0][0].x = 50;
              pts[0][0].y = 210;
              pts[0][1].x = 10;
              pts[0][1].y = 280;
              pts[0][2].x = 90;
              pts[0][2].y = 285;
              pts[1][0].x = 260;
              pts[1][0].y = 180;
              pts[1][1].x = 198;
              pts[1][1].y = 201;
              pts[1][2].x = 198;
              pts[1][2].y = 270;
              pts[1][3].x = 265;
              pts[1][3].y = 280;
              pts[1][4].x = 290;
              pts[1][4].y = 220;
    
              cvPolyLine( m_ipl, pts, npts, 2, true,CV_RGB(0,0,255), 2,  8, 0 );
              delete[] pts[0];
              delete[] pts[1];
              delete[] pts;
    

    Fordere ich korrekt den Speicher an und gebe ihn so korrekt frei? Danke fürs drüberschauen 🙂



  • Ja, ist so in Ordnung.



  • Polymere schrieb:

    pts = new CvPoint*[2];
    pts[0] = new CvPoint[3];
    pts[1] = new CvPoint[5];

    delete[] pts[0];
    delete[] pts[1];
    delete[] pts;

    Fordere ich korrekt den Speicher an?

    ja

    Polymere schrieb:

    und gebe ihn so korrekt frei?

    nein, besser

    delete[] pts[1];
              delete[] pts[0];
              delete[] pts;
    

    Speicherfreigabe immer umgekehrt proportional zur Anforderung. Kann sonst (muß nicht) zu Problemen führen.

    tschüß
    Troll.Soft



  • Troll.Soft schrieb:

    Speicherfreigabe immer umgekehrt proportional zur Anforderung. Kann sonst (muß nicht) zu Problemen führen.

    Probleme kann es geben, wenn z.B. delete[] pts; als erstes ausgeführt wird. Bei den anderen beiden Freigaben spielt die Reihenfolge keine Rolle.

    Wenn man die Möglichkeit hat, rät es sich übrigens, selbst verwaltende Klassen zu verwenden (z.B. std::vector oder hier boost::multi_array ). Dann muss man sich um weniger kümmern und hat einige Probleme nicht.


Anmelden zum Antworten