Problem mit Speicherfreigabe

Verschiedenes zu Qt
Antworten
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Problem mit Speicherfreigabe

Beitrag von nexus »

Hallo,

ich hab das Problem, dass sich mein gesamtes Programm beendet, wenn ich das "SelectMovie" Fenster schließe und davor der Speicher von "buffer" und "http" freigegeben wird. Hat da jemand eine Idee?

Code: Alles auswählen

void AddMovie::getMovieList()
{
	buffer = new QBuffer(this);
    buffer->open(QBuffer::ReadWrite);
    
    http = new QHttp(this);
    http->setHost("imdb.com");
    http->get("/find?s=tt&q=" + ui.titleALineEdit->text().replace(" ", "+"), buffer);
    
    connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(showMovieList(int, bool))); 
}

void AddMovie::showMovieList(int id, bool error)
{	
	if(id == 2 && error == false)
	{
		QStringList movieList;
		QString data;
		
		buffer->close();
		data = buffer->data();
		
		QRegExp rx("Popular Titles.*<ol>((?:.|\n)*)</ol>");
		rx.setMinimal(true);
		rx.indexIn(data);
		
		QRegExp rx2("href=\"(.*)\"\\s.*>(.*)</a>\\s\\(([0-9]{4})\\)");
		rx2.setMinimal(true);
		int pos = 0;

		while((pos = rx2.indexIn(rx.cap(1), pos)) != -1)
		{
		    movieList << rx2.cap(1) << rx2.cap(2) << rx2.cap(3);
		    pos += rx2.matchedLength();
		}
		
		delete buffer;
		delete http;
		
		SelectMovie sMovie(this, movieList);
		sMovie.exec();
	}
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Entweder mal die Reihefolge von delete buffer und delete http umdrehen oder vielleicht mal den Debugger anwerfen und nachschaun was der meint...
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag von nexus »

So hab den Fehler endlich doch gefunden. Das Problem lag darin, dass versucht wurde auf den bereits freigegebenen Speicher zuzugreifen. Denke ich :roll: Das Ganze sollte zumindest so aussehen:

Code: Alles auswählen

void AddMovie::getMovieList()
{
	buffer = new QBuffer(this);
    buffer->open(QBuffer::WriteOnly);
    
    http = new QHttp(this);
    http->setHost("imdb.com");
    http->get("/find?s=tt&q=" + ui.titleALineEdit->text().replace(" ", "+"), buffer);
    
    connect(http, SIGNAL(done(bool)), this, SLOT(showMovieList(bool))); 
}

void AddMovie::showMovieList(bool error)
{
	if(error == false)
	{
		http->disconnect();
		http->close();
	
		QStringList movieList;
		QString data;
		
		buffer->close();
		data = buffer->data();
		
		QRegExp rx("Popular Titles.*<ol>((?:.|\n)*)</ol>");
		rx.setMinimal(true);
		rx.indexIn(data);
		
		QRegExp rx2("href=\"(.*)\"\\s.*>(.*)</a>\\s\\(([0-9]{4})\\)");
		rx2.setMinimal(true);
		int pos = 0;

		while((pos = rx2.indexIn(rx.cap(1), pos)) != -1)
		{
		    movieList << rx2.cap(1) << rx2.cap(2) << rx2.cap(3);
		    pos += rx2.matchedLength();
		}
		
		delete buffer;
		delete http;
		
		SelectMovie sMovie(this, movieList);
		sMovie.exec();
	}
}
Antworten