multimap.insert wirft AccessViolationException

dertobian

Mitglied
Hallo,

hat jemand eine Idee, wie es dazu kommen kann, dass ein multimap.insert eine AccessViolationException wirft?

Hier der Code:
Code:
this->relation_pair_map.insert(pair<string, string>(list_id, hash));

Die Idee muss sich nicht wirklich zwingend auf meinen Code beziehen, ein grundsätzlicher Ansatz würde mir wahrscheinlich mehr weiterhelfen.


Gruß Tobian.
 
Hi.

Im Grunde passiert das, wenn ein ungültiger Zeiger dereferenziert wird. Es könnte sich um einen Zeiger in der Multimap oder in den Strings handeln.

Mehr kann man von dem Code-Schnipsel nicht mal ansatzweise erkennen...

Gruß
 
Es könnte auch sein, daß das Objekt, in der sich dieser Aufruf befindet, nicht existiert. Zugriff auf this (auch implizit), ratzbumm!

Was zeigt der Debugger an der Stelle für this an?
 
Hallo,

das ist ja das Komische. Debuggen bringt nix, wenn die Exceptions nur im Release kommen... Je nach Eingaben kommen sie auch an verschiedenen Stellen. Das Problem ist also nicht direkt die Multimap. Kann ich im Release auch irgendwie debuggen?

Vielleicht sollte ich mal kurz das Programm beschreiben. Ich habe in einer MySQL-Datenbank System Call-Events, die unter Linux geloggt wurden. Dann habe ich mit Visual Studio ein Programm geschrieben, welches mit eigener Abfragesprache bestimmte Events aus der Datenbank holt. Auf Wunsch kann diese Collection dann dreidimensional berechnet werden und mit Hilfe eines anderen Programms im 3D-Raum dargestellt werden. Das klappt auch alles. Ich habe nur festgestellt, dass die Exceptions, wie schon erwähnt, nur im Release kommen und auch nur dann, wenn ich die Events an das 3D-Programm geschickt habe.
 
Hier werden meine Events verwaltet:

Code:
#pragma once

public class EventListEntry
{
public:
	multimap<string, string> relation_pair_map;
	string hash;
	bool show;
	bool selected;
	bool is_obj_type;
	bool is_obj_color;
	int obj_type;
	ColorRGB *obj_color;
	WORD posX;
	WORD posY;
	WORD posZ;
	WORD size;
	unsigned char scaleX;
	unsigned char scaleY;
	unsigned char scaleZ;
	gcroot<AuditRecord^> audit_record;
};

public ref class SortedEventList
{
};

class EventListContainer;

public class EventList
{
public:
	string list_id;
	vector<EventListEntry *> list_entry;
	list<BisonQueryExpr *> expr_entry;
	map<string, set<int> > hash_map;
	bool calc_poly;
	gcroot<t_progressBar^> progressBar;

private:
	gcroot<Syscall^> syscall;
};

public class EventListContainer
{
public:
	vector<EventList *> container_entry;
};
 
Hui, ich glaube, ich habe die Stelle gefunden. Das Debugging habe ich (ganz clever und umständlich) gemacht, indem ich einfach mit "return" die eventuell betroffenen Funktionen vorher verlassen habe und dann ausprobiert habe, ob eine Exception kommt...
Es liegt an der Stelle "ZeroMemory":

Code:
void PolyData::sendClipBoardSelectionTo3DO(ArrayList^ event_id){
	if(this->is_sentTo3DO){
		cDatagram *lToSend;
		IN_OUT_ClipboardDelOrSel *lObj;
		int lNr = 0;
		int count = 0;

		//
		// set new selections
		//
		lToSend = new cDatagram[Math::Round(event_id->Count / 14, 0)];
		for(int n = 0; n < event_id->Count; n++){
			if((n%14) == 0){
				count = 0;
				lObj = (IN_OUT_ClipboardDelOrSel*)&lToSend[lNr++];
				ZeroMemory(lObj, sizeof(IN_OUT_ClipboardDelOrSel));
				lObj->mPaketID = IN_CLIPBOARD_SELECTION;
			}
			lObj->mObjNr[count] = System::Convert::ToInt32(event_id[n]);
			lObj->mCountSelectedObj = ++count;
		}
		if(event_id->Count > 0){
			if(!this->sendTo3DO(lToSend, lNr)){
				return;
			}
		}
	}
}

Kann mir jemand sagen, warum diese Stelle zu Problemen führt? Ich habe die Stelle jetzt einfach auskommentiert und kann froh sein, dass das 3D-Programm auch so damit klarkommt...
 
Zurück