Ik probeer via Delphi 7 een (zelfgemaakte) C++ DLL (gebouwd in MS Visual Studio 6) aan te roepen, maar nu gaat het mis qua geheugengebruik. Dit loopt bij iedere aanroep van de DLL-functie op 
De C++ code ziet er als volgt uit en werkt (in principe) goed:
In Delphi definieer ik het als volgt:
Mijn eerste gedachte (na _onwijs_ lang zoeken naar een oplossing in Delphi) was om "gewoon" de DLL die array weer te laten deleten, maar dat loste mijn geheugenlek nog niet op, het geheugengebruik steeg nog steeds bij iedere aanroep van de DLL-functie.
Mijn vraag is nu dus: hoe kan ik er voor zorgen dat ik wel het geheugen dat die array in gebruik heeft netjes verwijderd wordt?
De C++ code ziet er als volgt uit en werkt (in principe) goed:
C++:
Probleem hierbij is natuurlijk dat de "retvalue" eigenlijk verwijderd zou moeten worden, maar dat is weer onmogelijk doordat deze in Delphi nodig is...1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| char** Zipsearch::getStreets(char* streetPart, char* cityPart, char* zipcode, char* number, int& numberOfResults) { PVector* pStreets = findStreets(streetPart); numberOfResults = pStreets->getNumberOfElements()+1; int* indexArray; indexArray = pStreets->getArray(); char** retValue = new char*[numberOfResults+1]; for (int i = 0; i < numberOfResults; i++) { char* streetName = reinterpret_cast<char*>(&streetsMem[indexArray[i]] + 4); retValue[i] = new char[strlen(streetName)+1]; strcpy(retValue[i], streetName); } delete pStreets; return retValue; } |
In Delphi definieer ik het als volgt:
Delphi:
Dit levert natuurlijk een geheugenlek op, omdat de array die vanuit de DLL geretourneerd wordt, nergens verwijderd wordt.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| [..] TPCharArr = array[0..MaxInt div SizeOf(PChar) - 1] of PChar; PPCharArr = ^TPCharArr; [..] function getStreets (street: PChar; city: PChar; zipcode: PChar; housenr: PChar; var length: integer): PPCharArr; stdcall; external 'Search.dll'; [..] procedure ... var test: PPCharArr; len: integer; begin test := getStreets('x', '', '', '', len); {* Uitlezen van resultaten en toevoegen aan een Combobox met test^[..]. Werkt ook goed. *} end; |
Mijn eerste gedachte (na _onwijs_ lang zoeken naar een oplossing in Delphi) was om "gewoon" de DLL die array weer te laten deleten, maar dat loste mijn geheugenlek nog niet op, het geheugengebruik steeg nog steeds bij iedere aanroep van de DLL-functie.
Mijn vraag is nu dus: hoe kan ik er voor zorgen dat ik wel het geheugen dat die array in gebruik heeft netjes verwijderd wordt?