Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.07.2007, 19:47

Problem: Virtuellen Destruktor in DLL exportieren

Hi,

ich habe ein Problem.
Folgender Code

C-/C++-Quelltext

1
2
3
4
//test.cpp

//Kurz zum Test ein Objekt erzeugen und wieder löschen

tE::GraphicObject *Baum = new tE::GraphicObject();
delete Baum;

gibt immer diesen Fehler

(Link)



Und zwar wird dieser Fehler erst von

Quellcode

1
delete Baum;

ausgelöst.


Folgendermaßen sieht es aus:
tE::GraphicObject ist eine Klasse, deren Funktionen in einer DLL stecken.
Header: (der in test.cpp includiert wird)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//...

#define tE_EXPORT __declspec(dllexport)
//...

tE_EXPORT class GraphicObject
{
public:
    //constructors

    tE_EXPORT GraphicObject();
    //...

    //destructor

    tE_EXPORT virtual ~GraphicObject();
    //...

protected:
    BITMAP *Bitmap
    int PosX
    int PosY
};


Und die Definition des Kon- und Destruktors (also genau die zwei einzigen Methoden, die für den Fehler verantwortlich sind) sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//...

//constructor

GraphicObject::GraphicObject()
    : Bitmap(0), PosX(0), PosY(0)
{
}
//...

//destructor

GraphicObject::~GraphicObject() //it's virtual

{
    if(Bitmap)
        destroy_bitmap(Bitmap);
}
//...

Also nur total banal.
Trotzdem kommt diese Fehler...

Mit einer kleinen Änderung kommt der Fehler allerdings nicht mehr... und zwar, wenn ich das Schlüssekwort "virtual" vor dem Desktruktor weglasse...
Diese muss aber sein, denn GraphicObject dient als Basisklasse und dessen Konstruktoren müssen bekanntlich virtuell sein...
Warum kommt der Fehler?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.07.2007, 20:13

Re: Problem: Virtuellen Destruktor in DLL exportieren

Zitat von »"tobb"«

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//...

#define tE_EXPORT __declspec(dllexport)
//...

tE_EXPORT class GraphicObject
{
public:
    //constructors

    tE_EXPORT GraphicObject();
    //...

    //destructor

    tE_EXPORT virtual ~GraphicObject();
    //...

protected:
    BITMAP *Bitmap
    int PosX
    int PosY
};

Lass mal die tE_EXPORTs innerhalb der Klasse (vor C'tor und D'tor) weg. Die braucht man nicht. Nur vor der Klasse selbst muss es stehen bleiben. Ob es daran liegt, weiß ich nicht.

Ba'el

Alter Hase

Beiträge: 409

Wohnort: Erfurt

Beruf: Student (6 FS angew. Info. - Richtung Medieninformatik)

  • Private Nachricht senden

3

17.07.2007, 20:19

ja hab ich auch grad gesehen *sry* war bei pure virtual
aktuelle Projekte:
Ruby on Rails
XNA & Touchless
Progr. mobiler Endgeräte (GPS Trekking)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.07.2007, 20:23

Zitat von »"Ba'el"«

in einem virtuellen Destruktor darf nix stehen,

if(Bitmap)
destroy_bitmap(Bitmap);

muss in die Destruktoren der erbenden Klassen
(Da der Destruktor virtuell ist wird der Destruktor der abgeleiteten Klasse benutzt.)

Sorry, aber das ist Unsinn!
Informier dich mal, bevor du sowas schreibst.

5

17.07.2007, 20:28

Re: Problem: Virtuellen Destruktor in DLL exportieren

Zitat von »"David Scherfgen"«

Lass mal die tE_EXPORTs innerhalb der Klasse (vor C'tor und D'tor) weg. Die braucht man nicht. Nur vor der Klasse selbst muss es stehen bleiben. Ob es daran liegt, weiß ich nicht.

Doch doch, der "Export-Hinweis" muss vor jede Methode der Klasse.

Wenn nicht (habs gerade mal ausprobiert), ernte ich logischerweise diesen Fehler:

Quellcode

1
main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall tE::GraphicObject::GraphicObject(void)" (??0GraphicObject@tE@@QAE@XZ)" in Funktion ""int __cdecl _mangled_main(void)" (?_mangled_main@@YAHXZ)".

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.07.2007, 20:34

Re: Problem: Virtuellen Destruktor in DLL exportieren

Zitat von »"tobb"«

Doch doch, der "Export-Hinweis" muss vor jede Methode der Klasse.

Nein, das ist sogar verboten (wenn schon vor der Klasse ein dllexport steht):
http://msdn2.microsoft.com/en-us/library/81h27t8c.aspx

Zitat

Note that explicit use of the dllimport and dllexport attributes on members of an exportable class is prohibited.


Zitat

When you declare a class dllexport, all its member functions and static data members are exported. You must provide the definitions of all such members in the same program. Otherwise, a linker error is generated.

7

17.07.2007, 20:38

Ah, interessant, Danke.

Warum meckert dann der Compiler nicht, wenn es verboten ist... komisch.

Nur das kapiere ich nicht

Zitat

When you declare a class dllexport, all its member functions and static data members are exported. You must provide the definitions of all such members in the same program. Otherwise, a linker error is generated.

Aber daher wird wohl mein Linkererror kommen...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

17.07.2007, 20:41

Beim Verwenden der Klasse aus dem Programm muss dann natürlich dllimport statt dllexport da stehen. Hast du dein Makro entsprechend eingerichtet?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

17.07.2007, 21:22

Zitat von »"Ba'el"«

ja hab ich auch grad gesehen *sry* war bei pure virtual


Unsinn! Auch ein rein virtueller d'tor muss definiert werden.

@Topic: Compilier mal die dll mit MDd und pass die Optionen des Projekts welches die dll Verwendet an.
@D13_Dreinig

dax.

Frischling

Beiträge: 24

Beruf: Mathematiker (Student)

  • Private Nachricht senden

10

17.07.2007, 22:30

Wie hast du die DLL geladen ? Vielleicht passt ja da was nicht.
>> blub <<

Werbeanzeige