Laufzeitfehler beim zweidimensionalen, dynamischen Array



  • Ich arbeite an einer DLL und einer GUI die diese aufruft. Nun wollte ich eine dynamisches, zweidimensionales Array erstellen lassen und über die Schnittstelle in die DLL bringen. Allerdings stürzt das Programm beim beenden immer mit einem Laufzeitfehler ab. Der Debugger meint dazu das er hier liegt:

    Destruktor der Datenklasse innerhalb der DLL

    CDispData::~CDispData(void)
    {
    	// belegten Speicherplatz wieder freigeben
    
    	if (m_arrData != NULL)
    	{
    		// Elemente des dynamischen Arrays und danach das Array selbst löschen
    		for (int i=0; i < m_iRows; i++) 
    			delete [] m_arrData[i] ;    // <--- hier ist der Fehler
    		delete [] m_arrData; 
    	}
    
    }	// ~CDispData::~CDispData();
    

    Ich dachte erst das eventuell i zu weit läuft, aber bei einem Haltepunkt direkt davor stimmt der Wert von m_iRows.

    Hier erstmal der "Verlauf" den das Array nimmt...

    anlegen innerhalb der GUI

    iRows = 10;
    iColumns = 5;
    // das zweidimensinale Array anlegen
    m_arrData = new float*[iRows];			// dynamische Array von Zeigern anlegen
    for (int i=0; i < iRows; i++)			// an jeden Zeiger ein Array hängen 
    m_arrData[i] = new float[iColumns]; 
    // Array übergeben
    PassData(m_arrData, iRows, iColumns);
    

    Weiterleitung an der Schnittstelle zur DLL

    __declspec(dllexport) bool PassData(float **arrMatrix, int iRows, int iColumns)
    {
    	if(g_pDispData->InitDataMatrix(arrMatrix, iRows, iColumns) == false)
    		return false;
    
    	return true;
    }	// ~PassData();
    

    Sicherung innerhalb der Datenklasse der DLL

    bool CDispData::InitDataMatrix(float **arrMatrix, int iRows, int iColumns)
    {
    	// das zweidimensinale Array anlegen
    	m_arrData = new float*[iRows];			// dynamische Array von Zeigern anlegen
    	for (int i=0; i < iRows; i++)			// an jeden Zeiger ein Array hängen 
    		m_arrData[i] = new float[iColumns]; 
    
    	// Werte übernehmen
    	m_arrData	= arrMatrix;
    	m_iRows		= iRows;
    	m_iColumns	= iColumns;
    
    	return true;
    }	// ~CDispData::InitDataMatrix();
    

    könnte mir eventuell jemand dabei weiterhelfen?



  • Vielleicht solltest du den Inhalt des Arrays elementweise übernehmen. Deine Methode InitDataMatrix() legt erst genug Speicher an, dann vergisst sie diesen Speicherblock und biegt m_arrData um auf den von der GUI angelegten Speicherblock (abgesehen vom double free, wenn die GUI diesen Speicher wieder freigibt, haben DLLs häufig ihre eigene Heapverwaltung, die nicht unbedingt mit fremdem Speicher zurechtkommt)



  • hm, naja als Notlösung hat ich das auch schon in betracht gezogen, aber am liebsten wär mir halt ne einfache Übergabe gewesen. Aber in Anbetracht meiner Empfindlichkeit gegenüber Laufzeitfehlern (lacht) ist das wohl das beste und einfachste die Array-Daten einzeln zu übergeben...



  • Wenn du dir den ganzen Ärger mit new/delete ersparen willst, lass dir doch von deinem Compiler unter die Arme greifen. Der ANSI-C++ Standard hat nicht umsonst so nette Containerklassen wie vector<> oder deque<> definiert 😉



  • hmm... wenn ich die Probleme nicht loswerde, werd ich mir das auch mal anschauen...



  • CStoll schrieb:

    Wenn du dir den ganzen Ärger mit new/delete ersparen willst, lass dir doch von deinem Compiler unter die Arme greifen. Der ANSI-C++ Standard hat nicht umsonst so nette Containerklassen wie vector<> oder deque<> definiert 😉

    Ein besseres Argument als

    Laufzeitfehler beim zweidimensionalen, dynamischen Array

    gibt es eigentlich nicht für die Verwendung der Containerklassen...

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Ein besseres Argument als

    Laufzeitfehler beim zweidimensionalen, dynamischen Array

    gibt es eigentlich nicht für die Verwendung der Containerklassen...

    Gruß,

    Simon2.

    Das lässt sich auch ohne Containerklassen fehlerfrei programmieren.
    Leichter wirds schon, wenn er sein zweidimensionales Array eindimensional abbildet (jeweils nur 1 Aufruf von new und delete[] - statt der vielen.)

    mfg



  • Ja klar, du kannst das Rad gerne neu erfinden 😉 Aber warum sich die Mühe machen und etwa zwei Dutzend potentielle Fehlerquellen dabei erkennen und umschiffen, wenn schon andere Leute funktionierende Klassen für diesen Zweck entwickelt haben?



  • Bratwurst 2 schrieb:

    ...
    Das lässt sich auch ohne Containerklassen fehlerfrei programmieren...

    Habe auch nie Gegenteiliges behauptet !
    (Übrigens lässt sich eine GUI auch in ASM programmieren)
    Aus dieser Feststellung folgt aber noch nicht, dass es eine gute Idee oder die beste mögliche Lösung sei.

    Gruß,

    Simon2.


Anmelden zum Antworten