2017-04-10 1 views
1

Ich benutze Qt und cpp für meinen Code, in dem ich eine Klasse erstellt habe, die viele Daten enthält (sagen wir ~ 100MB im RAM). Im Destruktor dieser Klasse lösche ich diese Daten mit einer while-Schleife. Das Problem ist, dass wenn ich das Löschen dieser Klasse anrufe, der Haupt-Thread einfriert, da er damit beschäftigt ist, diese Daten zu löschen. Jemand sagte mir, dass Smart Pointer die Lösung ist, da es automatisch den Speicher freigibt und ich nicht explizit löschen muss, aber ich bezweifle, dass Smart Pointer auch nur den Speicher im Haupt-Thread freigibt. Ich möchte wissen, dass die Löschung von Smartpointern im Haupt-Thread erfolgt oder nicht?Cpp-Code Haupt-Thread-Einfrieren wegen des Löschens von Objekten kann mit Smart-Zeigern gelöst werden oder nicht?

Codebeispiel ist: Example.h

#ifndef EXAMPLE_H 
 
#define EXAMPLE_H 
 

 
#include <iostream> 
 
#include <qlist.h> 
 
#include <memory> 
 
#include <qdebug.h> 
 
#include <QColor> 
 

 
class Temp 
 
{ 
 
private: 
 
\t QList<QColor *> *m_colorList; 
 
public: 
 
\t Temp(); 
 
\t void addList(); 
 
\t ~Temp(); 
 
}; 
 

 
#endif

Example.cpp

Temp::Temp() 
 
{ 
 
\t std::cout<<"Temp Constructor"<<std::endl; 
 
\t m_colorList = new QList<QColor *>; 
 
} 
 

 
Temp::~Temp() 
 
{ 
 
\t for(int i=0;i<m_colorList->size();i++) 
 
\t \t delete m_colorList->at(i); 
 
\t delete m_colorList; 
 
} 
 

 
void Temp::addList() 
 
{ 
 
\t QColor *color; 
 
\t for(int i =0; i<=2000000; i++) 
 
\t { 
 
\t \t color = new QColor(10,20,50,255); 
 
\t \t m_colorList->append(color); 
 
\t } 
 
} 
 

 
int main(int argc,char *argv) 
 
{ 
 
\t Temp *tempObj = new Temp(); 
 
\t qDebug()<<"Adding list"; 
 
\t tempObj->addList(); 
 
\t qDebug()<<"List added"; 
 
\t for(int i=0;i<10;i++) 
 
\t \t qDebug()<<i; 
 
\t qDebug()<<"deleting list"; 
 
\t delete tempObj; 
 
\t tempObj=NULL; 
 
\t qDebug()<<"Memory deleted"; 
 
\t getchar(); 
 
}

+0

Fügen Sie Ihr Codebeispiel hinzu, bitte –

+1

Etwas hängt von Ihrem Smartpointer ab - bei einem shared_ptr wird das Löschen vom Thread ausgeführt, der den letzten Verweis auf das Objekt entfernt hat ... – UKMonkey

Antwort

0

Ein intelligenter Zeiger löscht das Objekt automatisch für Sie. Das ist alles. unter den Abdeckungen wird ein intelligenter Zeiger für Sie löschen - und das wird den Destruktor trotzdem ausführen.

Nichts wird in einem anderen Thread ausgeführt, es sei denn, Sie haben es so eingerichtet, dass es in einem anderen Thread ausgeführt wird. Während Sie dieses Löschen in einem Thread durchführen können, sind Sie dafür verantwortlich, dass nichts im Haupt-Thread auf das Objekt zugreift, während es gelöscht wird - offensichtlich, wenn Sie versuchen, auf einen Teil des Objekts zuzugreifen, als es gelöscht wird (oder danach) wird wahrscheinlich dein Programm zum Absturz bringen.

+0

Es bedeutet, wenn das letzte Objekt (das den Smartpointer verwendet)) wird im Hauptthread gelöscht, dann wird Destruktor von Smart Pointer auch im Hauptthread laufen? –

+0

Danke für die Untersuchung dieses Problems. Die Beschreibung von @gbjbaanb ist korrekt. Destruktor wird nur im Hauptthread aufgerufen. –

Verwandte Themen