Memory Leak im Thread



  • Hallo,

    ich habe einen Thread erzeugt, der auch wunderbar funktioniert.

    Problem bei der ganze Sache ist, dass ich den m_bAutoDelete auf FALSE habe und dass Objekt später per Delete lösche. Trotzdem bekomme ich Memory Leaks.

    Wenn ich m_bAutoDelete aber auf TRUE packe, bekomme ich keine Leaks. Demnach zur Folge muss ich doch noch irgendwas vergessen haben oder nicht?

    Schaut bitte mal kurz drüber.

    //Header

    CWinThread* thread;
    BOOL threadstart;
    BOOL abbruch;
    DWORD ExitCode;
    static UINT Starten(LPVOID pParam);
    

    //CPP Datei

    //Wird ausgeführt wenn Button OK gedrückt wird
    
    this->thread =  AfxBeginThread(Starten,this,THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    if( thread != NULL)
    {
    	thread->m_bAutoDelete = FALSE;
    	thread->ResumeThread();
    }
    else
    {
    	// Thread konnte nicht gestartet werden.
    }
    
    //Wird ausgeführt wenn CANCEL gedrückt wird
    this->abbruch = TRUE;
    if ( this->threadstart )
    {
    	while(WaitForSingleObject(this->thread->m_hThread, INFINITE) != WAIT_OBJECT_0);
    
    	GetExitCodeThread(this->thread->m_hThread,&ExitCode);
    	if ( ExitCode == 1 )
    	{
    		this->threadstart = FALSE;
    		this->thread->Delete();
    		test.Close();
    		OnCancel();
    	}
    }
    else
    {
    	test.Close();
    	OnCancel();
    }
    
    //Der Thread
    UINT CTestThreadDlg::Starten(void *pParam)
    {
    	CTestThreadDlg* lpouterThis = (CTestThreadDlg*) pParam;
    	lpouterThis->threadstart = TRUE;
    	int i = 0;
    	while ( i == 0 )
    	{
    		lpouterThis->test.WriteString("Testthread\n");
    		if ( lpouterThis->abbruch )
    		{
    
    			lpouterThis->threadstart = FALSE;
    			break;
    
    		}
    	}
    	AfxEndThread(1,TRUE);
    	return 0;
    }
    

    Ich weiß, dass das mit der Endlosschleife unschön ist, aber das jetzt nur son Testding damit ich den Fehler finden kann.

    Also wie gesagt: So wie der Code oben gezeigt ist, bekomme ich Memory Leaks, wenn ich m_bAutoDelete aber auf TRUE setzte, bekomm ich keine.

    Was hab ich vergessen? 😕


  • Administrator

    CWinThread::Delete macht eigentlich so gut wie nichts. Es löscht das Objekt, bzw. gibt den Speicher frei, aber nur wenn m_bAutoDelete auf TRUE ist ^^

    Was du also tun musst ist ganz einfach:

    delete this->thread;
    

    Also das CWinThread Objekt löschen.

    Grüssli ^^



  • jeppa juppi du

    warum bin ich da eigentlich net gleich druf gekommen?

    hat mich etwa die Delete() funktion so ausm Konzept gebracht? 😮


Anmelden zum Antworten