View Full Version : [c++] Dll per Excel, eccessivo utilizzo di memoria
Kesslers
21-06-2010, 12:06
Ciao a tutti,
ho un problema con una DLL scritta in C++ per Excel. Tale dll viene richiamata in un ciclo for, quindi eseguita alcune migliaia di volte. Osservando l'occupazione di memoria dal Task Manager ho notato che la memoria utilizzata da excel cresce continuamente fino raggiungere il massimo disponibile provocando il crash dell'excel.
Con altre dll scritte in fortran il problema non si presenta, però visto che la dll è parecchio lunga, non ho al momento intenzione di tradurla in fortran.
Nel codice ho avuto cura di deallocare gli array creati dinamicamente e mettere a NULL i puntatori.
Mi potete suggerire una strada per ovviare a questo problema?
Grazie mille!
Buona giornata...
tomminno
21-06-2010, 12:32
Se ritieni che il tuo codice non sia responsabile dei leak evidentemente è la libreria. Probabilmente tutte le volte che richiami quel metodo particolare esegue delle allocazioni che o non vengono deallocate prima della fine del metodo oppure richiedono una chiamata esplicita ad altro metodo per essere deallocate.
Kesslers
21-06-2010, 12:44
Mi sembra che sia a libreria la responsabile dei leaks, perchè se eseguo il codice commentando la chiamata alla dll, non ho problemi con la memoria.
Per deallocare i vettori che ho usato nel codice c++, ho usato "delete [] array" e poi "array=NULL". Ci sono altri modi per deallocare gli array?
Ecco, un altro problema che nasce nel richiamare la dll da vba...Se richiamo la dll da excel, ottengo un errore di overflow al termine della chiamata a meno di non mettere delle istruzioni intermedie che prendano tempo. Sono forse collegati i due problemi?
Grazie di nuovo!
se allo scaricamento della DLL (notifica DLL_PROCESS_DETACH, oppure nel codice del distruttore di una variabile globale) invochi la funzione _CrtDumpMemoryLeaks (http://msdn.microsoft.com/en-us/library/d41t22sb.aspx) viene inviato al debugger un dump dei blocchi di memoria allocati con new e non ancora deallocati.
Kesslers
21-06-2010, 13:12
Ho provato ad invocare la funzione _CrtDumpMemoryLeaks, ma non ottengo nessun errore: tutto sembra deallocato a dovere. Non è che è l'excel a continuare a riempire la memoria a questo punto?
Ho provato ad invocare la funzione _CrtDumpMemoryLeaks, ma non ottengo nessun errore: tutto sembra deallocato a dovere. Non è che è l'excel a continuare a riempire la memoria a questo punto? sicuro di averla invocata nel punto giusto?
inoltre puoi incollare qui il contenuto della Output Window di Visual Studio? ora non ricordo con certezza ma mi pare che la _CrtDumpMemoryLeaks non lasciasse mai "a mani vuote", se non c'era nessun leak un messaggio di successo te lo dava. mi pare.
ad ogni modo non é escluso che la colpa possa essere o di Excel o di qualche altro componente, per esempio il motore di parsing di VBScript utilizzato da Excel per far girare gli script in VBA. in questo caso peró non saprei aiutarti purtroppo, servirebbe qualche tool che ti faccia almeno capire da quale heap proviene il leak; tools del genere possono essere realizzati tramite apposite chiamate Win32 ma molto probabilmente ne esistono di giá fatti che io non conosco.
Kesslers
21-06-2010, 17:14
Io l'ho messa al termine del programma dopo aver deallocato tutti i vettori dinamici ed i puntatori.
Stando alla guida in linea la funzione restituisce True se si verificano errori, altrimenti restituisce False...
Andy1984
22-06-2010, 11:26
Utilizza l'interop della microsoft è una bomba non da nessun problema ed è veloce!;)
tomminno
22-06-2010, 12:05
Utilizza l'interop della microsoft è una bomba non da nessun problema ed è veloce!;)
Peccato che non sia C++
Kesslers
22-06-2010, 12:45
Non è disponibile, lavoro su un computer aziendale... :muro:
Andy1984
22-06-2010, 14:08
Come non è C++?? C++/cli.
Che vorresti dire che usi il pc aziendale, l'interop è scaricabile da internet...
Kesslers
22-06-2010, 14:17
Intendo dire che non posso aggiungere altri programmi a mio piacimento. :(
tomminno
22-06-2010, 17:08
Come non è C++?? C++/cli.
Che non è C++.
Il C++ è uno standard ISO, C++/CLI è un linguaggio della galassia .NET
Che non è C++.
Il C++ è uno standard ISO, C++/CLI è un linguaggio della galassia .NET be', é uno standard ECMA :p
comunque sono d'accordo, C++ e C++/CLI sono due linguaggi diversi, hanno solo delle somiglianze nella sintassi.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.