2017-04-06 1 views
0

Ich habe ein Problem mit virtuellen Methoden in C++ auf einem Multithreading-Kontext (Linux).rein virtuelle Methode im Thread der konkreten Klasse aufgerufen

Das nächste Beispiel zeigt mein Problem aus:

class Base { 

}; 

class Concrete1: public Base { //define pure virtual function 
    virtual void func() = 0; 
}; 

class Concrete2: public Concrete1 {  //override of virtual func 
    void func() {} 

    void run(){ 
     //.... 
     pthread_create(&handle, NULL, Concrete2::thread, static_cast<void*>(this)); 
    } 

    static void* thread(void arg*){ 
     Concrete2 *ptr = static_cast<Concrete2*>(arg); 
     //Concrete1 *ptr = static_cast<Concrete2*>(arg); // same error 

     while(1){ 
      //.... 
      ptr->func() 
     } 
    } 
}; 

int main(){ 
    Concrete2 obj; 
    obj.run(); 

    pthread_exit(NULL); 
    return 0; 
} 

Wenn die Leitung ptr->func() ausgeführt wird, wird folgende Fehlermeldung angezeigt:

pure virtual method called terminate called without an active exception 

Kann mir jemand sagen, warum die rein virtuelle Methode aufgerufen wird anstelle der überlagerten Methode?

+0

Wo deklarieren Sie 'func' als virtuell? –

+0

@ G.M. Es spielt keine Rolle, ob es das gleiche ist, aber das override-Schlüsselwort kann helfen, es einzugrenzen, wenn dies nicht der Fall ist. – Paul

+0

Ich denke, bezogen: https://stackoverflow.com/questions/7381757/c-terminate-called-without-an-active-exception – rsp

Antwort

0

Concrete2 wird auf dem Stapel erstellt und wird zerstört, sobald run aufgerufen wird.

Der erzeugte Thread hält obj nicht am Leben.

Ihre thread-Funktion versucht, ein zerstörtes Objekt zu dereferenzieren, auch bekannt als dangling pointer, was ein undefiniertes Verhalten darstellt.

+0

Danke! Das war das Problem. Anstatt das Objekt statisch zu erstellen, habe ich dynamisch erstellt, und es funktioniert. –

Verwandte Themen