d.uNd.eE Geschrieben 27. März 2008 Geschrieben 27. März 2008 Hi zusammen, ich hab nen Problem gehabt (mittlerweile gelöst)...ich versteh aber nicht, was schiefgelaufen ist. Also, Code ist folgender: class cTestCaseTopic //Classdefinitionheader of Class cTestCaseTopic(TCT) { public: //public accessable Functions and variables cTestCaseTopic(string szName); //Constructor string getName(); //Fuction to return Name bool addTCS(string szName,string szTCaseF, string szParamF);//Function to add a new TCS //private: //only from this class accessable variables and functions string name; //TCT's name vector<cTestCaseSet> TCSVector; //TCS's owned by this TCT }; bool cTestCaseTopic::addTCS(string szName,string szTCaseF, string szParamF) { cTestCaseSet TCS_temp(szName,szTCaseF,szParamF); TCSVector.push_back(TCS_temp); TCS_temp.~cTestCaseSet(); }; so...und jetzt mein problem bei der Sache: Wenn ich addTCT("","","); nutze, gibt das erstmal keine Probleme. wenn ich addTCT(foo,foo,foo); nutze gibt das nen Speicherzugriffsfehler (logisch, weil ich aus dem vector lösche :upps , naja, passiert) Wenn ein Wert jetzt aber höher ist als mein horizontaler Konsolenbuffer gibt das ne exception :confused: und zwar: "\KernelObjects\CritSecOutOfMemoryEvent" ehhmmm...kann mir das einer erklären? Weil Arbeitsspeicher ist genug frei. Ist das evtl auch nen Zugriffsfehler, und Sec bedeutet irgendwas wie "Section" :confused: Ist halt nur mal so interessehalber, weil ich so'n fehler noch nie hatte. PS: ich hab jetzt einfach das löschen aus dem vector weggelassen:bimei, seitden klappts :old Zitieren
Klotzkopp Geschrieben 27. März 2008 Geschrieben 27. März 2008 Wenn ich addTCT("","","); nutze, gibt das erstmal keine Probleme.Glück gehabt. wenn ich addTCT(foo,foo,foo); nutze gibt das nen Speicherzugriffsfehler (logisch, weil ich aus dem vector lösche :upps , naja, passiert)War zu erwarten, dass dir das um die Ohren fliegt, aber die Begründung ist totaler Blödsinn. Du löscht nichts aus dem Vector. Wenn ein Wert jetzt aber höher ist als mein horizontaler Konsolenbuffer gibt das ne exception :confused: und zwar: "\KernelObjects\CritSecOutOfMemoryEvent" ehhmmm...kann mir das einer erklären?Ja, das ist das Schöne bei undefiniertem Verhalten. Du kannst dich nicht darauf verlassen, dass es auf eine bestimmte Art und Weise abstürzt, du kannst dich nicht mal darauf verlassen, dass es überhaupt abstürzt (siehe dein erstes Beispiel). PS: ich hab jetzt einfach das löschen aus dem vector weggelassen:bimei, seitden klappts :old Wie gesagt, du löscht nichts aus dem Vector. std::vector::push_bask legt eine Kopie des Objekts im Vector ab. Das Problem ist, dass du den Destruktor einer Autovariablen (TCS_temp) explizit aufrufst. Dasselbe passiert aber auch automatisch (und damit zum zweiten Mal), wenn das Objekt aus dem Scope läuft. Solange du dein Objekt nicht mit placement-new angelegt hast, gibt es überhaupt keinen Grund, den Destruktor aufzurufen. Autovariablen tun das von allein, Objekte im Freispeicher musst du mit delete zerstören. Was immer du dir dabei gedacht hast, es ist Quatsch. Zitieren
d.uNd.eE Geschrieben 27. März 2008 Autor Geschrieben 27. März 2008 hmm...hast irgendwie recht...verdammt, was bin ich blöd :old nja...was ich jetz sage hast dir vermutlich schon gedacht...aber das Ding war mal als Pointer-Variabele definiert. Okai...vielen Dank...das nächste mal denk ich vorher nach :-) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.