"Zufällige" Zugriffsverletzung

Cromon

Erfahrenes Mitglied
Hallo zusammen!

In letzter Zeit plagt mich ein etwas mühsames Problem. Scheinbar zufällig kommt es bei mir unter gleichen Bedingungen manchmal zu Zugriffsverletzungen.

Ein Beispiel. Ich habe eine Klasse, die zur Verwaltung von Dateidatenbanken (Datenbanken in Dateien) verantwortlich ist. Dazu habe ich folgende Funktionen:
Code:
void AddRecord(T* record)
	{
		EnterCriticalSection(&cs);
		realloc(m_records, (m_recordcount + 1) * sizeof(T));
		m_records[m_recordcount] = *record;
		realloc(records, (++m_recordcount) * m_recordSize);
		for(ui32 i = 0; i < m_nFields; ++i)
		{
			char& f = m_format.at(i);
			switch(f)
			{
			case 'x':
				*(ui32*)(records + (m_recordcount - 1) * m_recordSize + (i * 4)) = 0;
				break;
			default:
				*(ui32*)(records + (m_recordcount - 1) * m_recordSize + (i * 4)) = *(ui32*)(((ui8*)record) + (i * 4));
				break;
			}
		}
		LeaveCriticalSection(&cs);
	}

Auf Grund von Lokalisierungen und ähnlichem muss m_recordSize nicht mit sizeof(T) (T ist ein Templatetyp) übereinstimmen, daher zwei verschiedene Speicher.

Zum Abrufen habe ich folgende Funktion:
Code:
	T* LookupEntry(ui32 id)
	{
		EnterCriticalSection(&cs);
		for(ui32 i = 0; i < m_recordcount; ++i)
		{
			if(*(ui32*)(m_records + i) == id)
			{
				T* ret = m_records + i;
				LeaveCriticalSection(&cs);
				return ret;
			}
		}
		LeaveCriticalSection(&cs);
		return 0;
	}

Nun habe ich aber ein Problem:
In unregelmässigen Abständen (ca 70-80% der Fälle) stürzt das Programm bei der Zeile:
Code:
if(*(ui32*)(m_records + i) == id)

ab mit der Meldung es fände eine Zugriffsverletzung statt. Merkwürdig dabei ist, dass ich genau die gleichen Eingaben verwenden kann und manchmal funktioniert es, manchmal nicht. Meine Vermutung war daher, dass es ein Threadingproblem war. Daher habe ich die CriticalSection eingebracht, die jedoch überhaupt keine Abhilfe geschafft hat.

Woran könnte so etwas liegen? Warum geht es manchmal und manchmal nicht mit den exact gleichen Werten?

/EDIT:
Problem behoben: realloc sollte nicht zusammen mit new verwendet werden, manchmal funktionierts, manchmal nicht. Hab es jetzt manuell gemacht und jetzt funktionierts!

Gruss
Cromon
 
Zuletzt bearbeitet:
Moin,

realloc sollte nicht zusammen mit new verwendet werden, manchmal funktionierts, manchmal nicht.

Stimmt :p
Übrigens deuten Zugriffsverletzungen meist auf Speicherzugriffsprobleme hin, wobei sie sich leider oftmals nur schwer lokalisieren lassen!

Tipp: falls Du nicht aus zwingenden Gründen nur C verwenden musst, solltest Du Speicher tunlichst immer mit new/delete allokieren und auf die alte C-Syntax mit alloc/free und vor allem realloc tunlichst verzichten. Ich hatte damit vor geraumer Zeit auch diverse Probleme nach einer Projektübernahme! Nachdem alle ca. 60 (!) Stellen umgebaut waren , liefe die SW wieder problemlos (!)

Frohes Fest!
Gruß
Klaus
 
Zurück