Zum Inhalt springen

Objekt zerstören


wulfgang

Empfohlene Beiträge

Moin,ich bekomme von meinem Programm(Konsolenanwendung unter VisualStudio geschrieben), wenn ich das Programmfenster wieder schließen will, als erstes die Meldung:

Debug Error!

Program: ...

R6025

-pure virtual function call

(press etry to debug the application)

Das Problem ist ein CInternetSession Objekt. Bin leider noch nicht ganz dahintergekommen, wie ich den Fehler beseitige. Ich weiß, dass der Fehler nur auftaucht wenn ich

CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY ,(_T( "proxy")), NULL, 0);
außerhalb einer Methode erzeuge also z.B in einer Source:
CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY ,

	                          (_T( "proxy")), NULL, 0);  

Connect::Connect(void)

{}

Kommt der Fehler daher, dass ich session erst zerstören muss? Aber einfach nur delete(session) in der aufrufenden Umgebung funktioniert nicht. Session ist in der aufrufenden Umgebung nicht bekannt :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kommt der Fehler daher, dass ich session erst zerstören muss?
Der Fehler rührt vermutlich daher, dass session erst dann zerstört wird, wenn es dafür eigentlich zu spät ist. Das kommt dabei raus, wenn man statt eines ordentlichen Designs globale Variablen benutzt.

Aber einfach nur delete(session) in der aufrufenden Umgebung funktioniert nicht.
Delete darfst du auch nur mit Objekten machen, die du mit new angelegt hast.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Pure Virtual Function call heisst, dass du eine Funktion aufrufst, die zwar definiert, aber nicht implementiert ist.

Da es beim Beenden passiert, tippe ich auf einen Fehler im Destruktor deiner CInternetSession, dazu hast du aber leider keinen Code gepostet.

Wenn es bei CInternetSession kracht, wäre deren Innenleben interessant.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie soll ich mir denn den Callstack anzeigen lassen?

Der Debugger wirft zum Schluss aus:

The thread 'Win32 Thread' (0xa40) has exited with code -1073741510 (0xc000013a).

The thread 'Win32 Thread' (0xcf8) has exited with code -1073741510 (0xc000013a).

'test.exe': Loaded 'C:\WINDOWS\system32\msctf.dll', No symbols loaded.

The program '[732] test.exe: Native' has exited with code 3 (0x3).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber vorher zeigt er doch diese Fehlermeldung an, oder?

Ja.

Debug > Windows > Call Stack geht bei mir nicht. Habe stattdessen als Optionen zur Auswahl:

Debug > Windows > Immediate

Debug > Windows > Breakpoints

Debug > Windows > Output

Bei alt+F7 erhalte ich vom Debugger ebenfalls nur die oben von mir zitierte Ausgabe.

Bearbeitet von wulfgang
Link zu diesem Kommentar
Auf anderen Seiten teilen

Debug > Windows > Call Stack geht bei mir nicht. Habe stattdessen als Optionen zur Auswahl:

Debug > Windows > Immediate

Debug > Windows > Breakpoints

Debug > Windows > Output

Dann läuft das Programm nicht mehr, d.h. du stehst mit dem Debugger nicht an der Stelle, an der der Fehler auftritt.

Bei alt+F7 erhalte ich vom Debugger ebenfalls nur die oben von mir zitierte Ausgabe.
Alt+7, nicht Alt+F7.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay habe jetzt 1 zu 1 aus dem Fenster von vom Stack rauskopiert:

> msvcr80d.dll!_NMSG_WRITE(int rterrnum=25) Line 198 C

msvcr80d.dll!_purecall() Line 54 + 0x7 bytes C

mfc80ud.dll!CSessionMapPtrToPtr::RemoveKey(void * hInternet=0x00cc0004) Line 75 C++

mfc80ud.dll!CInternetSession::Close() Line 475 C++

mfc80ud.dll!CInternetSession::~CInternetSession() Line 441 C++

test.exe!`dynamic atexit destructor for 'session''() + 0x28 bytes C++

msvcr80d.dll!doexit(int code=0, int quick=0, int retcaller=1) Line 553 C

msvcr80d.dll!_cexit() Line 413 + 0xb bytes C

msvcr80d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 389 C

msvcr80d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 214 + 0x11 bytes C

Hilft das irgendwie?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber dann muss ich das Programm ja komplett umstricken.:(
Deswegen sollte man sich über Designfragen ja auch vorher Gedanken machen, und nicht einfach drauf los frickeln.

Vermutlich reicht es aus, wenn du deine Session als lokale Variable in main erstellst, und dort, wo du sie brauchst, eine Referenz darauf übergibst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay Referenzen übergebe ich ja normalerweise mit z.B

konstruktor(&referenz)
. Wie soll ich das denn hier anstellen:confused: Bisher sieht meine Klasse ungefähr so aus: Connect.h
#pragma once

#include <afx.h>

#include <afxwin.h>

#include <afxinet.h>

class Connect

{

public:

	Connect(void);

	static CFtpConnection * Connect::getLastConnection(); 

	static CFtpConnection *connection_pointer;

	~Connect(void);

};
Connect.cpp:
CFtpConnection Connect::*connection_pointer=0;

CFtpConnection* Connect::connection_pointer=NULL;

  CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY ,

	                          (_T( "proxy")), NULL, 0);



Connect::Connect(void)

{

try

	{


	//FTP-Verbindung wird eröffnet,Methode GetFtpConnection wird auf session angewandt, 

    //connection wird auf zurückgegeben Zeiger gesetzt

		if(connection_pointer = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) 

			{

			cout << "Verbindung wurde aufgebaut\n";      

			}


	}

	//Fehleroutine

	catch (CInternetException* pEx)

    {

		cout<<"FEHLER : "<<GetLastError()<<endl;

        TCHAR sz[1024];

        pEx->GetErrorMessage(sz, 1024);

        printf_s("ERROR!  %S\n", sz);

        pEx->Delete();

     }


	cout << "Test Konstruktor von Connect erfolgreich\n"; 

	  // if the connection is open, close it

    if (connection_pointer != NULL) 

    {

        connection_pointer->Close();

        //delete connection_pointer;

    }



}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay Referenzen übergebe ich ja normalerweise mit z.B
konstruktor(&referenz)

.

Nein, damit übergibst du die Adresse von referenz, das ist ein Zeiger. Auf der Seite des Aufrufers sieht ein Referenzparameter genauso aus wie ein Value-Parameter.

Wie soll ich das denn hier anstellen:confused:
Indem du dem Connect-Konstruktor einen CInternetSession&-Parameter verpasst.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...