[C++] Erreur de runtime: appel d'une fonction virtuelle pure
Bonsoir,
j'ai un probleme avec le morceau de code suivant:
Code:
1 2
| ThreadWaitClients main_thread;
main_thread.run(0); |
Si je le place dans un bloc indépendant:
Code:
1 2 3 4
| {
ThreadWaitClients main_thread;
main_thread.run(0);
} |
j'obtiens l'erreur de runtime énoncée dans le titre du topic.
Voici les définitions interressantes:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class ThreadWrapper
{
bool _launched;
HANDLE _hd;
DWORD _id;
void *_args;
static DWORD WINAPI launch(LPVOID param);
virtual void exec(void *args) = 0;
public:
ThreadWrapper();
virtual ~ThreadWrapper();
void run(void *args);
};
ThreadWrapper::ThreadWrapper()
: _launched(false)
{
}
ThreadWrapper::~ThreadWrapper()
{
if (_launched)
CloseHandle(_hd);
}
void ThreadWrapper::run(void *args)
{
_args = args;
_hd = CreateThread(NULL, 0, launch, this, 0, &_id);
_launched = true;
}
DWORD WINAPI ThreadWrapper::launch(LPVOID param)
{
ThreadWrapper *this_thread = (ThreadWrapper *)param;
this_thread->exec(this_thread->_args);
return 0;
} |
et
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class ThreadWaitClients : public ThreadWrapper
{
void exec(void *args);
public:
ThreadWaitClients();
~ThreadWaitClients();
};
void ThreadWaitClients::exec(void *args)
{
cout << "hello from thread waiting for clients" << endl;
} |
lorsque le code de départ est dans un bloc indépendant (et uniquement dans ce cas),
Code:
this_thread->exec(this_thread->_args);
appelle la méthode virtuelle pure de la classe ThreadWrapper!
Quelqu'un pourrait m'expliquer pourquoi?
Comme d'hab, merci d'avance pour votre aide précieuse =)
Variable détruite trop tôt
Dans un bloc indépendant, main_thread est une variable automatique locale au bloc : elle est détruite avant que run(0) se termine, ce qui cause l'erreur dont tu parles.
Cette erreur n'apparaît pas s'il y a une autre instruction juste après (ie autre chose qu'une accolade fermante).