hilfe bei einem unregelmäßig auftretendem problem (zugriffsverletzung)



  • hallo profis,

    hoffe die frage ist hier richtig.
    ich schreibe an einem kleinen programm und habe ein unregelmäßig auftretendes problem:
    Visual Studio 2005 gibt mir diesen fehler aus:

    Eine Ausnahme (erste Chance) bei 0x00d1f0a7 in prog.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xa4018249.
    Unbehandelte Ausnahme bei 0x00d1f0a7 in prog.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xa4018249.
    Das Programm "[3952] prog.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.

    hier der code wo er auftritt:

    relevant sind zwei klassen: Storage und Body:
    beide verwalten Objekte auf dem heap.

    void	Storage::SORT_BODY_LIST(void)
    {
    	int i,j;
    	int maxb = MAX_BODIES; //=5
    
    	Body*	placeholder = new Body;
    	for(i=0;i<maxb;i++)
    	{
    		if(this->GET_POINTER_TO_BODY(i)->GET_BODY_ACTIVE() == false && i<=body_counter) //body_counter ist member von Storage
    		{	
    
    			*placeholder = *(this->GET_POINTER_TO_BODY(i));
    			for(j=i+1;j<(maxb);j++)
    			{
    				*(pBody_List + (j - 1)) = *(this->GET_POINTER_TO_BODY(j)); //<- der fehler passiert in dieser schleife (operator)
    			}
    			*(pBody_List + maxb - 1) = *placeholder;
    		}
    	}
    	delete placeholder;
    }
    

    und hier der code für den = operator:

    Body&		Body::operator =(const Body& copiedBody)
    {
    
    	if(this == &copiedBody)
    		return *this;
    
    	upper_point_counter		= copiedBody.upper_point_counter;
    	lower_point_counter		= copiedBody.lower_point_counter;
    	current_upper_point		= copiedBody.current_upper_point;
    	current_lower_point		= copiedBody.current_upper_point;
    
    	if(pFirst_Point!=0)
    	delete  pFirst_Point;  //<- fehler wird hier angezeigt
    	if(pUpper_Point_List!=0)
    	delete []	pUpper_Point_List;
    	if(pLower_Point_List!=0)
    	delete []	pLower_Point_List;
    	if(pLine_List!=0)
    	delete []	pLine_List;
    
    	pFirst_Point			= new Point;
    	pFirst_Point			= copiedBody.pFirst_Point;
    
    	pUpper_Point_List		= new Point[max_points];
    	pLower_Point_List		= new Point[max_points];
    	pLine_List				= new Line[max_lines];
    
    	body_number				= copiedBody.body_number;
    	body_is_static			= copiedBody.body_is_static;
    	body_is_active			= copiedBody.body_is_active;
    	body_name				= copiedBody.body_name;
    
    	int i;
    
    	for(i=0; i<max_points;i++)
    	{
    		pUpper_Point_List[i] = copiedBody.pUpper_Point_List[i];
    		pLower_Point_List[i] = copiedBody.pLower_Point_List[i];
    	}
    
    	for(i=0; i<max_lines;i++)
    	{
    		pLine_List[i] = copiedBody.pLine_List[i];
    	}
    
    	return *this;
    }
    

    die ausnahme kommt in unregelmäßigen abständen an unterschiedlichen stellen (sprich unterschiedliche j), aber immer in der gleichen Schleife in etwa 1 von 3 Fällen. Kann mir jemand sagen was ich falsch gemacht habe?

    hier noch die Funktion GET_POINTER_TO_BODY:

    Body*	Storage::GET_POINTER_TO_BODY(int nr)
    {
    	return (pBody_List + nr);
    }
    

    Vielen Dank
    kyp



  • Prüfe Deinen Index bevor Du auf Deinen Speicher zugreifst.

    Vermutlich stimmt der Index nicht und Du greifst ausserhalb Deines reservierten Speichers zu.



  • Knuddlbaer schrieb:

    Prüfe Deinen Index bevor Du auf Deinen Speicher zugreifst.

    Vermutlich stimmt der Index nicht und Du greifst ausserhalb Deines reservierten Speichers zu.

    hallo knuddelbaer
    hab ich gemacht. meiner meiner meinung nach ist die indizierung sicher. das problem liegt eher am operator =.

    aber ich kann mir da keinen reim drauf machen warum.
    ist doch richtig erst die pointer zu löschen und dann neu zuzuweisen.
    z.b.

    delete pFirst_Point;
    ...
    
    pFirst_Point = new Point;
    

    bin verzweifelt, denn ich brauche diese funktion.

    besten gruß und danke für die antwort

    kyp



  • if(pFirst_Point!=0) 
        delete  pFirst_Point;  //<- fehler wird hier angezeigt
    

    Die Kommentare mit der Fehlerstelle hab ich übersehen. Wenn es hier beim delete kracht, dann liegt es meist daran, das der Speicher bereits freigegeben wurde oder Dir nicht gehört.

    Initialisierst Du pFirst_Point vor der ersten Verwendung ?

    Btw.: delete auf nullpointer ist erlaubt, Du solltest nach dem delete aber den Pointer noch auf null setzen.



  • mit initialisieren meinst du

    pFirst_Point = 0; ??

    ja mach ich. und nachdem ich jetzt die Pointer wieder auf null gesetzt habe crashed es immer noch.



  • Dann bleibt eigentlich nurnoch:

    1. Speicher wurde wo anderst bereits freigegeben
    2. Speicherüberlauf bzw. zugriff auf falscher Stelle (IMHO kann es dann bei einem delete ebenfalls knallen).

    Lass Dich mal nach C++ verschieben, hier kann vllt. jemand Tips aus der Erfahrung geben.

    Bis dahin prüfe noch mal genau die Zugriffe über den Index (ich sehe hier z.B. nicht welchen Wert l haben könnte) und stell sicher, das der Pointer nicht irgendwo anderst per delete gelöscht wurde. (Wenn das sicher gestellt ist, bleiben IMHO nurnoch die Zugriffe über die Zeigerarithmetik).

    => Vorschlag: Verschieben nach C++



  • => Vorschlag: Verschieben nach C++

    wie verschiebe ich? an wen muss ich mich wenden?



  • der befehl SORT_LIST wird aufgerufen wenn auf einen Knopf in einem Dialog gedrückt wird.

    der Absturz passiert nie beim ersten mal. kann es auch daran liegen, dass
    der =operator noch nicht ganz durchgelaufen ist, und ich ein zweites mal durch drücken des knopfes die meldung raussende den =operator aufzurufen, ein konflikt entsteht?



  • Solange alles im gleichen Thread abläuft IMHO nein.

    Stell sicher das pFirst_Point auf einen gültigen noch nicht gelöschten Speicher verweist.

    Aber schau mal hier:

    pFirst_Point            = new Point;
        pFirst_Point            = copiedBody.pFirst_Point;
    

    Das ist unsinn.

    Zeile 1 legt speicher an und sichert den Zeiger in pFirst_Point.
    Zeile 2 nimmt den Zeiger von copiedBody und lässt pFirst_Point auf den Speicher von copiedBody.pFirst_Point zeigen. Somit wird der gleiche Speicherbereich 2 mal gelöscht.

    Du musst den Inhalt umkopieren, nicht einfach nur den Zeiger!



  • THANK U SO MUCH!!!!!!!!!!

    das hat geholfen! jetzt tritt der fehler nicht mehr auf. da hätte ich in zehn jahren nicht mehr hingeguckt 🙂

    nochmal danke. danke danke!

    kyp



  • gelöscht



  • Zugriffsfehler...soweit bahnhof für mich...

    void main(){
    //	FILE f;	
    	std::string a;
    	a = "hallo";
    	printf("Welche Datei möchten sie kopieren? ");
    	getchar();
    	scanf("%s",a);
    	printf("Sie wollen %s kopieren",a);
    	getchar();
    }
    

    bim scanf kommt immer dieser Fehler:
    Unbehandelte Ausnahme bei 0x0043ea30 in ueb01.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000.

    ist hier jemand speicher ,adressen und so weiter spezialist...ich wäre froh...
    so simpel das programm ist, so müehsamer werden die Fehler hab ich das gefühl.

    greez joe


Anmelden zum Antworten