Seite 1 von 1

Problem mit Speicherfreigabe

Verfasst: 28. Mai 2007 21:04
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();
	}
}

Verfasst: 28. Mai 2007 21:13
von upsala
Entweder mal die Reihefolge von delete buffer und delete http umdrehen oder vielleicht mal den Debugger anwerfen und nachschaun was der meint...

Verfasst: 29. Mai 2007 00:38
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();
	}
}