objekt dynamisch in dll erzeugt, aber wo löschen??
-
hallo,
__declspec(dllexport)int* test() { int* x; *x = 10; return x; }meine frage lautet, wo muss der speicher jetzt gelöscht werden??
im hauptprogramm?int* myx = test(); delete myx;oder irgendwo in der dll?
-
Verwenden die DLL und das Hauptprogramm den gleichen Heap, dann kannst du dir das aussuchen. Das ist z.B. der Fall wenn du für beide MSVC verwendest und die selbe Version der "DLL Runtime" (Version der Runtime: MSVC Version + Debug/Release Unterschied).
Wenn du nicht sicherstellen kannst dass der gleiche Heap verwendet wird musst du das was in der DLL angefordert wird auch in der DLL wieder freigeben, und was in der EXE angefordert wird auch in der EXE wieder freigeben. In dem Fall bekommst du aber wahrscheinlich noch zusätzliche Probleme, da oft & gerne Speicher von irgendwelchen STL Klassen intern angeforder und freigegeben wird. Eine Funktion die einen std::string als Returnwert hat ist z.B. schonmal verboten in so einem Fall. Und das betrifft natürlich nicht nur die STL sondern auch einen Haufen andere Libraries.
-
Zuerst ein Hinweis: Deine Funktion erstellt keine neue Integer-Variable, da Du mit
int* x;einen Zeiger erstellst, der auf einen undefinierten Speicherbereich zeigt. Und dem Wert an diesem undefinierten Speicherbereich weist Du jetzt mit
*x = 10;den Wert 10 zu, was undefiniertes Verhalten zur Folge hat. Richtig ist es so:
int* x = new int; *x = 10;Nun zu Deiner Frage: Klar, man könnte das ganze im Hauptprogramm löschen. (Edit: Ob das mit DLL-Dateien funktioniert, weiß ich leider nicht.) Aber da der Nutzer normalerweise nicht weiß, was genau in der Funktion steht und ob da etwas mit new erstellt wird, würde ich eine analoge Lösch-Funktion schreiben. So zum Beispiel:
int *CreateIntPointer () { int *x=new int; *x=10; return x; } void DeleteIntPointer (int *pointer) { delete pointer; }
-
diese analoge löschfunktion in der dll schreiben, aber wo aufrufen?
in der dll geht das ja nicht, also auch im aufrufenden programm selbst??also so
int* myx = test(); DeleteIntPointer(myx);oder wo soll ich diese aufrufen??
-
@dsfdsfdsf:
int* myx = test(); DeleteIntPointer(myx);Genau.
Wenn sowohl 'test' als auch 'DeleteIntPointer' in ein-und-der-selben DLL implementiert sind dann passt das so. Von wo aus 'test' und 'DeleteIntPointer' aufgerufen werden spielt keine Rolle.Natürlich darf keine der beiden Funktionen dann inline implementiert sein, hoffe das ist klar.