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.