STL vector kopieren und loeschen



  • Hallo zusammen

    ich mache sowas:

    vector<PointN>* vEins
    vector<PointN> v = *vEins;
    vEins->clear();
    

    Das heisst ich moechte den Inhalt von Adresse vEins an v uebergeben und vEins dann loeschen, damit ich ihn neu fuellen kann. Aber beim Versuch vEins zu clearen stuerzt er mir ab mit dem Hinweis das das ein Valid Pointer sei. Kann ich das so nicht einfach kopieren und dann den Inhalt loeschen? Muss ich den vector vEins als Referenz uebergeben damit ich das so machen kann? Ich muss halt den Inhalt von vEins aendern und vEins wieder zurueckgeben, daher die rumkopiererei.



  • Die Zuweisung ändert nichts an *vEins. Der Zeiger war also vermutlich schon vorher nicht gültig.



  • In meinem vEins steht aber das drin was soll. Daran kanns also nicht liegen.



  • samo schrieb:

    Aber beim Versuch vEins zu clearen stuerzt er mir ab mit dem Hinweis das das ein Valid Pointer sei.

    Na, wenner Valid ist, ist doch alles gut 😃

    In meinem vEins steht aber das drin was soll. Daran kanns also nicht liegen.

    Schade, naja dann wirds wohl woanders dran liegen (*HINT,HINT* mehr Code *HINT,HINT*)



  • samo schrieb:

    In meinem vEins steht aber das drin was soll.

    Das heißt gar nichts. Das ist das Problem bei undefiniertem Verhalten: Du kannst daraus, dass etwas funktioniert, nicht schließen, dass alles in Ordnung ist.

    Daran kanns also nicht liegen.

    Na dann sind's wohl Sonnenflecken.



  • o.k., die genaue Fehlermeldung heisst: user breakpoint. und zwar funktioniert die clear() methode noch, aber danach stuerzt er ab bei der deallokierung. Allerdings versteh ich nicht warum er meinen Pointer deallokiert, wenn ich den Inhalt meines Vectors loesche. Ich dachte immer dabei bleibt der Speicher trotzdem erhalten bei einem Vector.



  • und ich moechte doch auch gar nicht den pointer loeschen sondern nur das was an der adresse steht. Kann ich das nicht weil mein anderer vector jetzt genau mit dieser Adresse arbeitet? Und wenn dem so ist, wie mache ich es anders?

    Danke und sorry fuer die vielleicht bloeden Fragen 😕



  • samo schrieb:

    o.k., die genaue Fehlermeldung heisst: user breakpoint. und zwar funktioniert die clear() methode noch, aber danach stuerzt er ab bei der deallokierung.

    Der Fehler wird vermutlich schon viel früher verursacht, er macht sich nur erst beim Aufruf von clear bemerkbar.

    Ich kann mich nur LordJaxom anschließen: Zeig den Code. Am besten ein compilierbares Minimalbeispiel, das den Fehler reproduziert.



  • o.k., die genaue Fehlermeldung heisst: user breakpoint.

    Sicher, dass das Programm abstürzt? Ist "user breakpoint" nicht ganz einfach eine Meldung des Debuggers, dass du einen Breakpoint gesetzt hast und jetzt manuell die Programmausführung fortführen musst?

    MfG SideWinder



  • o.k., das ganze tritt in diesem umfeld auf:

    void _declspec (dllexport)alignData(char* cMarkerName, vector<PointN>& vPoints, vector<PointN>& vNormals)
    {
    	string szName(cMarkerName);
    	ifstream file(szName.c_str());
    
    	string::size_type pos1 = 0;
    	string::size_type pos2 = 0;
    
    	string szBuffer;
    	string szValue;
    	PointN p(0.,0.,0.);
    	PointN q(0.,0.,0.);
    	PointN r(0.,0.,0.);
    	PointN trans(0.,0.,0.);
    	vector<PointN> vRot;
    	bool found; //bool for transformation, if there is no transformation calculated for that datafile, do nothing and return
    
    	//read transformation (rotation and translation) saved in the markerfile
    	while(getline(file, szBuffer))
    	{
    		if(szBuffer.find("#rotation",0) != string::npos)
    		{
    			found = true;
    			file >> p[0] >> q[0] >> r[0] >> p[1] >> q[1] >> r[1] >> p[2] >> q[2] >> r[2];
    			vRot.push_back(p);
    			vRot.push_back(q);
    			vRot.push_back(r);
    		}
    		else if(szBuffer.find("#translation",0) != string::npos)
    		{
    			file >> trans[0] >> trans[1] >> trans[2];
    		}
    	}
    	file.close();
    
    	if(!found)
    	{
    		printf("No translation calculated for that file!\n");
    	}
    	else
    	{
    		printf("aligning data......\n");
    
    		vector<PointN> vStorePoints = vPoints;
    		vPoints.clear(); //<-hier stuerzt er ab
    		//calculate transformation on the datapoints
    		for(unsigned int i = 0; i < vStorePoints.size(); i++)
    		{
    			PointN dummy = vStorePoints[i];
    			dummy.transform(vRot, trans);
    			vPoints.push_back(dummy);
    		}
        }
    }
    

    Der Fehler tritt auch erst auf, wenn ich das Programm als DLL einbinde und laufen lasse, vorher nicht.



  • weiss nu nich, warum er da abschmiert, aber warum kopierst du soviel um?

    vector<PointN> vStorePoints = vPoints;
            vPoints.clear(); //<-hier stuerzt er ab
            //calculate transformation on the datapoints
            for(unsigned int i = 0; i < vStorePoints.size(); i++)
            {
                PointN dummy = vStorePoints[i];
                dummy.transform(vRot, trans);
                vPoints.push_back(dummy);
            }
    

    warum nicht einfach so?

    //calculate transformation on the datapoints
            for(unsigned int i = 0; i < vPoints.size(); i++)
                vPoints[i].transform(vRot, trans);
    

Anmelden zum Antworten