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::vectoroder hierboost::multi_array). Dann muss man sich um weniger kümmern und hat einige Probleme nicht.