Suche Programm zum finden von Speicherlecks
-
Hi
passt hier net rein, aber auch nirgens anders.
Ich suche ein Programm was Speicherlecks findet, die von anderen Programmen verursacht werden können, ich überreiche nämlich eine Reihe Pointer an ein anderes Programm und delete sie erst im anderen Programm und würde gerade deswegen gerne wissen ob ich auch wirklich alles gelöscht habe.
-
Ankou schrieb:
Hi
passt hier net rein, aber auch nirgens anders.
Ich suche ein Programm was Speicherlecks findet, die von anderen Programmen verursacht werden können, ich überreiche nämlich eine Reihe Pointer an ein anderes Programm und delete sie erst im anderen Programm und würde gerade deswegen gerne wissen ob ich auch wirklich alles gelöscht habe.Das ist technisch weder auf Linux- noch unter Windowssytemen möglich. Bitte lüg uns nicht an.
-
was ist nicht möglich?
Kann gut sein, dass es nicht möglich ist, um das zu probieren wollte ich ja das Programm ;P
Aber mal Genauer:
ich rufe aus Ruby eine C++ DLL auf, dazu muss ich für jede Funktion die DLL neu laden. Nun konventiert die eine Funktion das Objekt in ein char* und gibt ihn zurück, die Funktion in Ruby nimmt ihn auf und reicht ihn als Übergabeparameter an eine andere DLL Methode(da diese ja so nicht miteinander kommunizieren können), die DLL is aber die Selbe. Dort wird das ganze wieder zurück zu dem Objekt und ich kann das Objekt auch ganz normal verwenden, also... warum sollte ich es dann nicht dort auch löschen können?
-
Ankou schrieb:
was ist nicht möglich?
Kann gut sein, dass es nicht möglich ist, um das zu probieren wollte ich ja das Programm ;P
Aber mal Genauer:
ich rufe aus Ruby eine C++ DLL auf, dazu muss ich für jede Funktion die DLL neu laden. Nun konventiert die eine Funktion das Objekt in ein char* und gibt ihn zurück, die Funktion in Ruby nimmt ihn auf und reicht ihn als Übergabeparameter an eine andere DLL Methode(da diese ja so nicht miteinander kommunizieren können), die DLL is aber die Selbe. Dort wird das ganze wieder zurück zu dem Objekt und ich kann das Objekt auch ganz normal verwenden, also... warum sollte ich es dann nicht dort auch löschen können?Unter Linux nimmt man dafür Valgrind.
-
Siehe:
http://www.codeproject.com/KB/applications/leakfinder.aspxBzw. meine neuere Version:
http://blog.kalmbachnet.de/files/LeakFinder-RC5.zip
-
Ankou schrieb:
was ist nicht möglich?
Kann gut sein, dass es nicht möglich ist, um das zu probieren wollte ich ja das Programm ;P
Aber mal Genauer:
ich rufe aus Ruby eine C++ DLL auf, dazu muss ich für jede Funktion die DLL neu laden. Nun konventiert die eine Funktion das Objekt in ein char* und gibt ihn zurück, die Funktion in Ruby nimmt ihn auf und reicht ihn als Übergabeparameter an eine andere DLL Methode(da diese ja so nicht miteinander kommunizieren können), die DLL is aber die Selbe. Dort wird das ganze wieder zurück zu dem Objekt und ich kann das Objekt auch ganz normal verwenden, also... warum sollte ich es dann nicht dort auch löschen können?1. Eine DLL Ist kein anderes Programm! Sondern Code der dynamisch in den eigenen Prozess geladen wird.
2. Wenn die DLL einen char* returniert, dann frage ich mich, woher diese den Speicher hat. Du müsstest den Speicher mit der entsprechenden entgegengesetzten Methode free/delete/GlobalFree/LocalFree wieder freigeben. Und wenn malloc/new im Spiel sind garantiert auch mit der selben CRT.
3. char* aus DLLs zurückliefern ist eine Unsitte. Man übergibt an DLLs Zeiger mit Speicher und die DLL kopiert die Daten dort hinein.
-
1. Eine DLL Ist kein anderes Programm! Sondern Code der dynamisch in den eigenen Prozess geladen wird.
ja, sry, ich weiß, ich drück mich nur meist einfach falsch aus x.x
2. Wenn die DLL einen char* returniert, dann frage ich mich, woher diese den Speicher hat. Du müsstest den Speicher mit der entsprechenden entgegengesetzten Methode free/delete/GlobalFree/LocalFree wieder freigeben. Und wenn malloc/new im Spiel sind garantiert auch mit der selben CRT.
Die Dll besorgt sich den Speicher selbst und gibt ihn auch selbst wieder frei, nur halt in einer anderen Methode und ich kann halt keine Variablen dauerhaft speichern(nehm ich an), weil ich die DLL jedes mal neu rein laden muss
3. char* aus DLLs zurückliefern ist eine Unsitte. Man übergibt an DLLs Zeiger mit Speicher und die DLL kopiert die Daten dort hinein.
nu, Ruby beschränkt sich aber auf char* was in Ruby auch automatisch in einen String konventiert wird. Pointer selbst gibbet in Ruby nich, was alles andere wohl ein bisschen schwierig macht
Siehe:
http://www.codeproject.com/KB/applications/leakfinder.aspxBzw. meine neuere Version:
http://blog.kalmbachnet.de/files/LeakFinder-RC5.zipdanke, ich schaus mir ma an=)
-
Dann musst Du String aus dem Zeiger eben speichern und dann die DLL den Zeiger wieder freigeben lassen, bevor Du die DLL entlädst.
-
Ich muss in Ruby die DLL für jede Funktion neu laden, deswegen mache ich das mit dem char* Zeiger ja überhaupt, damit ich ein Objekt über mehrere Funktionen erhalten kann.
edit:
und zu dem Programm: der will das Visual Studio Projekt nicht in Version 2008 konventieren(und auch nicht kompilieren, nun den #error hab ich mal entfernt).
-> Welche Libraries muss ich noch linken?
Und die Links der alten Version funktionieren nicht mehr...