Absturz bei delete (DAMAGE: after Normal Block...)



  • Code:

    class CProcPath : public CObject{
    
    	private:
    		int	*m_aiOptions; // Zeiger auf Optionen des Pfades.
    		const int m_iSize;
    	public:
    
    		CProcPath(int iOptCount) : m_aiOptions(NULL), m_iSize(iOptCount){
    			//Erzeugen
    			m_aiOptions = new int[iOptCount];
    			//Initialisieren
    			for(UINT i=0; i< getOptCount(); i++,m_aiOptions[i]=-1);
    		}
    
    		CProcPath::~CProcPath(){
    			//Optionsarray löschen
    			delete[] m_aiOptions; //<--- ABSTURZ
    		}
    
    		int CProcPath::getOptCount() const { return m_iSize; }
    
    		int &CProcPath::operator[](size_t index){
    			//Prüfen ob Index ok		
    			if(index<0 || index>= getOptCount())
    				ASSERT(index>=0);
    			return m_aiOptions[index];
    		}
    
    		void setDirection(size_t index,int i){ m_aiOptions[index]=i;}
    
    		void DEBUG_Trace(){
    			CString str;
    			int k= getOptCount();
    			for(int i=0; i< getOptCount(); i++){
    				str.AppendFormat("%i ",m_aiOptions[i]);
    			}
    			str.Append("\n");
    			TRACE(str);
    		}
    
    	};
    

    Programm stürzt ab im Destuktor bei delete. Hab ich was über sehen?



  • Erstens hast du das ASSERT() falsch eingesetzt 😉

    Und zweitens fehlr dir vermutlich ein Copy-Ctor und operator=.



  • hmm aber kann es daran liegen das er im Dstruktor abstürzt?

    wenn ich nur:

    CProcPath *p = new CProcPath(5);
    

    und dann

    delete p;
    

    mache kackt er schon ab, dafür brauch ich keinen Copy-Ctor... und das ASSERT ist auch egal..



  • mach aus:

    for(UINT i=0; i< getOptCount(); i++,m_aiOptions[i]=-1);
    

    das:

    for(int i=0; i< getOptCount(); i++)
      m_aiOptions[i]=-1;
    

    🙂



  • @vista: sauber... jetzt klappts:)



  • BorisDieKlinge schrieb:

    @vista: sauber... jetzt klappts:)

    ...und weisst du auch warum?



  • weil ich "i" erhöhe bevor ich auf den bereich zugriefe, und so komm ich jedes mal eine einheit über die Array größe !! odeR?



  • Ja. Trotzdem benötigst du jetzt noch einen CopyCTor und einen Op=, siehe dazu auch "Die Regel der großen 3": http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=BigThree#Answ

    MfG SideWinder



  • naja Rgel hi noder her.. aber die werde ich nie brauchen...

    ich erzeuge ein int array

    int *p = new int[x];
    

    imd Konsturktor und lösceh diese wieder im destruktor mit

    delete[] p;
    

    oder gibts keine ausnahme?

    Ich kopiere nie ein objekt welche das array enthält oder weise es einem anderen zu....NIE 🙂 oder hat es andere grüde?



  • BorisDieKlinge schrieb:

    Ich kopiere nie ein objekt welche das array enthält oder weise es einem anderen zu....NIE 🙂 oder hat es andere grüde?

    Sei vorsichtig mit diesen Aussagen - Kopien tauchen mitunter schneller auf als dir lieb ist - und wenn du dann nicht vorgesorgt hast, fliegt dir das Programm um die Ohren.

    PS: Und wenn du ganz sicher bist, daß du diese Klasse NIE kopieren willst, solltest du das auch dem Compiler sagen:

    class CProcPath : public CObject
    {
      ...
    private:
      //Kopier-Operationen privat und OHNE IMPLEMENTATION
      CProcPath(const CProcPath&);
      CPorcPath& operator=(const CProcPath&);
    };
    

Anmelden zum Antworten