Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

ich habe eine Funktion in einer Dll die ein char*** übergeben bekommt und dafür

ein 2 dim. Array reserviert und mit Werten füllt.

Wenn ich dann aber den Speicher in der Exe wieder mit free() freigeben will, bekomme ich eine Accessviolation.

Wenn ich mir die Funktion aber in die Exe kopiere und nicht aus der Dll lade ,

funktioniert es einwandfrei.:confused:

Habt ihr ne Idee warum?

Gruß

Guybrush

Geschrieben

Die DLL und die EXE haben jeweils ihren eigenen Heap. Du allokierst auf dem Heap der DLL und gibst auf dem Heap der EXE frei.

Du kannst das vermutlich verhindern, indem du für DLL und EXE dieselbe DLL-Version der C-Runtime verwendest.

Nicht zuletzt vom Design-Standpunkt gesehen, ist es aber wahrscheinlich besser, wenn die EXE den Speicher selbst holt.

--> Verschoben: C++: Compiler, IDEs, APIs

Geschrieben
Original geschrieben von Klotzkopp

Nicht zuletzt vom Design-Standpunkt gesehen, ist es aber wahrscheinlich besser, wenn die EXE den Speicher selbst holt.

Das ist leider nicht möglich, die Funktion bekommt nämlich noch einen String

übergeben und splitten diesen anhand eines Zeichens auf und verteilt die einzelnen

Teile in das 2 dim. Array.

Du kannst das vermutlich verhindern, indem du für DLL und EXE dieselbe

DLL-Version der C-Runtime verwendest.

Kannst du das mal genauer erklären?

Geschrieben
Original geschrieben von Guybrush Threepwood

Das ist leider nicht möglich, die Funktion bekommt nämlich noch einen String

übergeben und splitten diesen anhand eines Zeichens auf und verteilt die einzelnen

Teile in das 2 dim. Array.

Das ist eigentlich immer möglich. Die DLL kann ja einen Fehlercode zurückgeben, wenn der von der EXE übergebene Speicher nicht groß genug ist.

Kannst du das mal genauer erklären?
Deine DLL und deine EXE verwenden die C-Laufzeitumgebung. Das ist eine Bibliothek, die sich u.a. um den Heap kümmert. Es gibt sie (bei MSVC) in drei Versionen: Single-threaded, Multi-threaded und Multi-threaded DLL. Dazu gibt es jeweils noch eine Debug-Version.

Nur die letzte kann man dynamisch linken, d.h. in allen anderen Fällen hast du zwei Laufzeitumgebungen, eine in der EXE und eine in der DLL, und damit auch zwei Heaps. Nur wenn beide die Multi-threaded DLL-Version verwenden, teilen sie sich eine Laufzeitumgebung, und damit auch einen Heap.

Die Einstellung, welche Laufzeitbibliothek verwendet werden soll, findest du bei MSVC in den Projekteinstellungen unter C/C++->Code Generation.

Geschrieben
Original geschrieben von Klotzkopp

Das ist eigentlich immer möglich. Die DLL kann ja einen Fehlercode zurückgeben, wenn der von der EXE übergebene Speicher nicht groß genug ist.

Das wäre aber etwas umständlich finde ich.

Die Einstellung, welche Laufzeitbibliothek verwendet werden soll, findest du

bei MSVC in den Projekteinstellungen unter C/C++->Code Generation.

Das müßte dann ja bei jedem Projekt eingestellt werden das die Funktion

benutzen will.

Ich glaube dann schreibe ich die Funktion anstatt in die DLL, in die dazugehörige

Headerdatei. Dann sollte es ja keine Probleme geben.

Danke!

Gruß

Guybrush

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...