Speicherbedarf wächst in Himmel
-
Hi! Ich verwende diese Methode in mehreren Threads gleichzeitig und habe festgestellt das der Speicherbedarf des Programmes immer größer wird je länger es läuft... Nur leider weiß ich nicht woran es liegt...
CString getFileSource(CString url, bool refresh) { CInternetSession session; CString somecode, s; CInternetFile* file; try { if(refresh) { file = reinterpret_cast<CInternetFile*> (session.OpenURL(url, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD)); } else { file = reinterpret_cast<CInternetFile*> (session.OpenURL(url)); } } catch (CInternetException* m_pException) { file = NULL; m_pException->Delete(); } if(file) { while (file->ReadString(somecode)) { s += somecode; } } session.Close(); file->Close(); delete file; return s; }
MfG
ExElNeT
-
Also so auf Anhieb kann ich keinen Fehler feststellen. Wie groß ist denn der Speicherzuwachs in etwa???
-
alle 3 minuten ca 100k.... es hängt auch von der anzahl der threads ab, die die methode benutzen. Bin sehr sicher das es an dieser Methode liegt
danke schonmal
MfG
ExElNeT
-
Warum der cast auf CInternetFile*?
-
damit ich an die methode ReadString von file rankomme... ich muss doch die daten runterladen und in einen string speichern zur weiterverabeitung... oder siehst du einen einfacheren weg, wo man nur eine url benötigt?
MfG
ExElNeT
-
CInternetSession::OpenURL gibt einen Zeiger auf eine Instanz einer von CStdioFile abgeleiteten Klasse zurück. Da ReadString virtuell ist, wird sowieso die richtige Methode aufgerufen. Bleib also lieber bei CStdioFile*. OpenURL gibt nämlich nur bei FTP-URLs wirklich einen CInternetFile* zurück.
Mit dem erhöhten Speicherbedarf sollte das allerdings nichts zu tun haben. Das Leck liegt wohl an anderer Stelle.
-
Hi!
Falls du den Fehler nicht finden solltest, dann probier's mal mit dem Programm BoundsChecker. Damit kannst du Memory Leaks und andere Fehler in deinem Sourcecode entdecken. Gibt's dort als 14-tägige Testversion.
-
Auch VC++ hat einen Memoryleakcheck drin.
Das Programm im Debug starten ohne einen Breakpoint.
-
Prinzipiell ist Dein Code auch nicht ordentliches C++ ..., so ist es besser:
CString getFileSource(CString url, bool refresh) { CString somecode, s; try { CInternetSession session; CInternetFile* file; if(refresh) { file = reinterpret_cast<CInternetFile*> (session.OpenURL(url, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD)); } else { file = reinterpret_cast<CInternetFile*> (session.OpenURL(url)); } if( file) { while( file->ReadString(somecode)) { s += somecode; } session.Close(); file->Close(); delete file; } } catch (CInternetException* m_pException) { m_pException->Delete(); } return s; }
Edit: Das file = NULL im catch-Block musste natprlich weg !
[ Dieser Beitrag wurde am 18.11.2002 um 12:14 Uhr von RenéG editiert. ]
-
Nee - Du kannst doch nicht auf file zugreifen - Das hast du doch im try-Block deklariert.
So würde ich es machen:
bool getFile(LPCTSTR url,CString& theFile,bool refresh) { /*static*/ CInternetSession session; CStdioFile* file = 0; CString text; bool succ = true; theFile.Empty(); try { file = session.OpenURL(url, 1, INTERNET_FLAG_TRANSFER_BINARY | (refresh ? INTERNET_FLAG_RELOAD : 0)); while( file->ReadString(text)) theFile += text /*+= "\r\n"*/; } catch (CInternetException* e) { e->ReportError(MB_ICONERROR); e->Delete(); succ = false; } if(file) { file->Close(); delete file; } return succ; }
btw: Schonmal versucht mit F7 im IE zu kompilieren?
[ Dieser Beitrag wurde am 18.11.2002 um 10:16 Uhr von Nemesyzz editiert. ]
-
Nette Beispiele... aber im Prinzip sind sie auch alle gleich..... und keins davon löst mein problem
naja ich werde es mal mit dem boundschecker probieren... aber danke an alle dies probiert haben *g
MfG
ExElNeT