Fehler bei Stringkonvertierung

TheBodo

Erfahrenes Mitglied
Aloha,

ich bin gerade dabei, während eines kleinen privaten Projekts C++ zu vertiefen. Dabei versuche ich von einer MySQL-Datenbank Daten auszulesen und als xml auszugeben.

Das Laden der Daten funktioniert soweit, und da ich verschiedene Datentypen benutze, verbinde ich diese per std::stringstream, den ich dann am Ende in einen String umwandeln möchte. Auch das funktioniert, doch sobald ich den String als Rückgabewert nutzen möchte, kriege ich folgenden Fehler:

Code:
*** glibc detected *** /home/christoph/cpp/tippspiel/AppServer/Debug/AppServer: double free or corruption (!prev): 0x0000000000cd1740 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fdee3e90b96]
/usr/lib/libmysqlpp.so.3(_ZN7mysqlpp8DBDriverD1Ev+0xcc)[0x7fdee470b71c]
/usr/lib/libmysqlpp.so.3(_ZN7mysqlpp8DBDriverD0Ev+0x9)[0x7fdee470b7f9]
/usr/lib/libmysqlpp.so.3(_ZN7mysqlpp10ConnectionD1Ev+0x2a)[0x7fdee4705d3a]
/home/christoph/cpp/tippspiel/AppServer/Debug/AppServer[0x402da5]
/home/christoph/cpp/tippspiel/AppServer/Debug/AppServer[0x4048dc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fdee3e3376d]
/home/christoph/cpp/tippspiel/AppServer/Debug/AppServer[0x402659]
======= Memory map: ========
00400000-00407000 r-xp 00000000 08:05 910061                             /home/christoph/cpp/tippspiel/AppServer/Debug/AppServer
00606000-00607000 r--p 00006000 08:05 910061                             /home/christoph/cpp/tippspiel/AppServer/Debug/AppServer
00607000-00608000 rw-p 00007000 08:05 910061                             /home/christoph/cpp/tippspiel/AppServer/Debug/AppServer
00cd0000-00d0d000 rw-p 00000000 00:00 0                                  [heap]
7fdedc000000-7fdedc021000 rw-p 00000000 00:00 0 
7fdedc021000-7fdee0000000 ---p 00000000 00:00 0 
7fdee1f60000-7fdee1f78000 r-xp 00000000 08:03 396475                     /lib/x86_64-linux-gnu/libresolv-2.15.so
7fdee1f78000-7fdee2178000 ---p 00018000 08:03 396475                     /lib/x86_64-linux-gnu/libresolv-2.15.so
7fdee2178000-7fdee2179000 r--p 00018000 08:03 396475                     /lib/x86_64-linux-gnu/libresolv-2.15.so
7fdee2179000-7fdee217a000 rw-p 00019000 08:03 396475                     /lib/x86_64-linux-gnu/libresolv-2.15.so
7fdee217a000-7fdee217c000 rw-p 00000000 00:00 0 
7fdee217c000-7fdee2183000 r-xp 00000000 08:03 396436                     /lib/x86_64-linux-gnu/libnss_dns-2.15.so
7fdee2183000-7fdee2382000 ---p 00007000 08:03 396436                     /lib/x86_64-linux-gnu/libnss_dns-2.15.so
7fdee2382000-7fdee2383000 r--p 00006000 08:03 396436                     /lib/x86_64-linux-gnu/libnss_dns-2.15.so
7fdee2383000-7fdee2384000 rw-p 00007000 08:03 396436                     /lib/x86_64-linux-gnu/libnss_dns-2.15.so
7fdee2384000-7fdee2386000 r-xp 00000000 08:03 392485                     /lib/libnss_mdns4_minimal.so.2
7fdee2386000-7fdee2585000 ---p 00002000 08:03 392485                     /lib/libnss_mdns4_minimal.so.2
7fdee2585000-7fdee2586000 r--p 00001000 08:03 392485                     /lib/libnss_mdns4_minimal.so.2
7fdee2586000-7fdee2587000 rw-p 00002000 08:03 392485                     /lib/libnss_mdns4_minimal.so.2
7fdee2587000-7fdee2593000 r-xp 00000000 08:03 396438                     /lib/x86_64-linux-gnu/libnss_files-2.15.so
7fdee2593000-7fdee2792000 ---p 0000c000 08:03 396438                     /lib/x86_64-linux-gnu/libnss_files-2.15.so
7fdee2792000-7fdee2793000 r--p 0000b000 08:03 396438                     /lib/x86_64-linux-gnu/libnss_files-2.15.so
7fdee2793000-7fdee2794000 rw-p 0000c000 08:03 396438                     /lib/x86_64-linux-gnu/libnss_files-2.15.so
7fdee2794000-7fdee2795000 ---p 00000000 00:00 0 
7fdee2795000-7fdee2f99000 rw-p 00000000 00:00 0 
7fdee2f99000-7fdee2f9b000 r-xp 00000000 08:03 396388                     /lib/x86_64-linux-gnu/libdl-2.15.so
7fdee2f9b000-7fdee319b000 ---p 00002000 08:03 396388                     /lib/x86_64-linux-gnu/libdl-2.15.so
7fdee319b000-7fdee319c000 r--p 00002000 08:03 396388                     /lib/x86_64-linux-gnu/libdl-2.15.so
7fdee319c000-7fdee319d000 rw-p 00003000 08:03 396388                     /lib/x86_64-linux-gnu/libdl-2.15.so
7fdee319d000-7fdee319e000 rw-p 00000000 00:00 0 
7fdee319e000-7fdee31b4000 r-xp 00000000 08:03 396507                     /lib/x86_64-linux-gnu/libz.so.1.2.7
7fdee31b4000-7fdee33b3000 ---p 00016000 08:03 396507                     /lib/x86_64-linux-gnu/libz.so.1.2.7
7fdee33b3000-7fdee33b4000 r--p 00015000 08:03 396507                     /lib/x86_64-linux-gnu/libz.so.1.2.7
7fdee33b4000-7fdee33b5000 rw-p 00016000 08:03 396507                     /lib/x86_64-linux-gnu/libz.so.1.2.7
7fdee33b5000-7fdee34b0000 r-xp 00000000 08:03 396415                     /lib/x86_64-linux-gnu/libm-2.15.so
7fdee34b0000-7fdee36af000 ---p 000fb000 08:03 396415                     /lib/x86_64-linux-gnu/libm-2.15.so
7fdee36af000-7fdee36b0000 r--p 000fa000 08:03 396415                     /lib/x86_64-linux-gnu/libm-2.15.so
7fdee36b0000-7fdee36b1000 rw-p 000fb000 08:03 396415                     /lib/x86_64-linux-gnu/libm-2.15.so
7fdee36b1000-7fdee396d000 r-xp 00000000 08:03 805247                     /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0
7fdee396d000-7fdee3b6c000 ---p 002bc000 08:03 805247                     /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0
7fdee3b6c000-7fdee3b72000 r--p 002bb000 08:03 805247                     /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0
7fdee3b72000-7fdee3bf0000 rw-p 002c1000 08:03 805247                     /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0
7fdee3bf0000-7fdee3bf5000 rw-p 00000000 00:00 0 
7fdee3bf5000-7fdee3c0d000 r-xp 00000000 08:03 396469                     /lib/x86_64-linux-gnu/libpthread-2.15.so
7fdee3c0d000-7fdee3e0c000 ---p 00018000 08:03 396469                     /lib/x86_64-linux-gnu/libpthread-2.15.so
7fdee3e0c000-7fdee3e0d000 r--p 00017000 08:03 396469                     /lib/x86_64-linux-gnu/libpthread-2.15.so
7fdee3e0d000-7fdee3e0e000 rw-p 00018000 08:03 396469                     /lib/x86_64-linux-gnu/libpthread-2.15.so
7fdee3e0e000-7fdee3e12000 rw-p 00000000 00:00 0 
7fdee3e12000-7fdee3fc7000 r-xp 00000000 08:03 396373                     /lib/x86_64-linux-gnu/libc-2.15.so
7fdee3fc7000-7fdee41c6000 ---p 001b5000 08:03 396373                     /lib/x86_64-linux-gnu/libc-2.15.so
7fdee41c6000-7fdee41ca000 r--p 001b4000 08:03 396373                     /lib/x86_64-linux-gnu/libc-2.15.so
7fdee41ca000-7fdee41cc000 rw-p 001b8000 08:03 396373                     /lib/x86_64-linux-gnu/libc-2.15.so
7fdee41cc000-7fdee41d1000 rw-p 00000000 00:00 0 
7fdee41d1000-7fdee41e6000 r-xp 00000000 08:03 396398                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fdee41e6000-7fdee43e5000 ---p 00015000 08:03 396398                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fdee43e5000-7fdee43e6000 r--p 00014000 08:03 396398                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fdee43e6000-7fdee43e7000 rw-p 00015000 08:03 396398                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fdee43e7000-7fdee44cc000 r-xp 00000000 08:03 794607                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fdee44cc000-7fdee46cb000 ---p 000e5000 08:03 794607                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fdee46cb000-7fdee46d3000 r--p 000e4000 08:03 794607                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fdee46d3000-7fdee46d5000 rw-p 000ec000 08:03 794607                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fdee46d5000-7fdee46ea000 rw-p 00000000 00:00 0 
7fdee46ea000-7fdee473d000 r-xp 00000000 08:03 790326                     /usr/lib/libmysqlpp.so.3.1.0
7fdee473d000-7fdee493c000 ---p 00053000 08:03 790326                     /usr/lib/libmysqlpp.so.3.1.0
7fdee493c000-7fdee493f000 r--p 00052000 08:03 790326                     /usr/lib/libmysqlpp.so.3.1.0
7fdee493f000-7fdee4940000 rw-p 00055000 08:03 790326                     /usr/lib/libmysqlpp.so.3.1.0
7fdee4940000-7fdee4962000 r-xp 00000000 08:03 396351                     /lib/x86_64-linux-gnu/ld-2.15.so
7fdee4ad9000-7fdee4b47000 rw-p 00000000 00:00 0 
7fdee4b5e000-7fdee4b62000 rw-p 00000000 00:00 0 
7fdee4b62000-7fdee4b63000 r--p 00022000 08:03 396351                     /lib/x86_64-linux-gnu/ld-2.15.so
7fdee4b63000-7fdee4b65000 rw-p 00023000 08:03 396351                     /lib/x86_64-linux-gnu/ld-2.15.so
7fff11693000-7fff116b4000 rw-p 00000000 00:00 0                          [stack]
7fff117ff000-7fff11800000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Mein Quelltext sieht wie folgt aus (Ausschnitt):

Code:
string getContent() {
                stringstream content;
	content << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
	content << "    <request type=\"answer\">" << endl;
	cout << "stringstream initalisiert und 2 zeilen geschrieben" << endl;
	// Connect to the database.
	mysqlpp::Connection conn(false);
	if (conn.connect("tippspiel", "localhost", "tippspiel", "xxxxxxxxxxxx")) {
		string sql = "SELECT u.user, c.name, s.shout FROM users u, competition c, shouts s";
		sql += " WHERE u.id=s.user_id AND c.id=s.competition ORDER BY s.shout_time DESC";
		cout << "nach concat sql" << endl;
		mysqlpp::Query query = conn.query(sql);
		if (mysqlpp::StoreQueryResult res = query.store()) {
			for (size_t i = 0; i < res.num_rows(); ++i) {
				content << "        ";
				content << "<item type=\"shout\" user=\"" << res[i][0] << "\" competition=\"" << res[i][1] << "\">" << endl;
				content << "        " << res[i][2] << "" << endl;
				content << "        </item>" << endl;
				cout << "zeile " << i << " geschrieben." << endl;
			}
		}
		else {
			cerr << "Failed to get item list: " << query.error() << endl;
			return "fail";
		}
	} else {
		cerr << "DB connection failed: " << conn.error() << endl;
		return "fail";
	}
	conn.shutdown();
	conn.~Connection();
	content << "</request>";
	cout << "letzte zeile geschrieben" << endl;
	string rtstring = content.str();
	cout << "nur ausführung" << endl;
	return rtstring;
}

Die couts sind nur dazu da, um den Fehler zu lokalisieren, die dazugehörige Ausgabe:

Code:
stringstream initalisiert und 2 zeilen geschrieben
nach concat sql
zeile 0 geschrieben.
zeile 1 geschrieben.
 [...]
zeile 1062 geschrieben.
zeile 1063 geschrieben.
letzte zeile geschrieben
nur ausführung

Hat jemand eine Idee, warum das beim return-Statement den Fehler wirft?
 
Hallo,

ich weiss nicht, ob ich mit meiner Vermutung richtig liege, aber die Fehlermeldung deutet normalerweise darauf hin, dass Speicher wieder freigegeben werden soll, der bereits freigegeben wurde. Was mir in dem Zusammenhang ins Auge gesprungen ist, ist folgende Zeile

Code:
conn.~Connection();

Ich würde darauf tippen, dass hier das Problem liegt und der Fehler auftritt weil du die Funktion verlässt und dann der Destruktor für conn nochmal aufgerufen wird. Kommentier die Zeile dochmal aus.

Gruß,
Wolf
 
Hallo Wolf,

danke dir für deine Antwort, genau daran lag es, ich hätte noch eine kurze Frage.
Wann rufe ich denn dann Destruktoren überhaupt manuell auf?
 
Gar nicht.
Und falls das Aufrufen ohne Löschen Sinn macht ist drin nichts, was man Destruktor nennen kann.

Beim delete´n des Objekts (bzw. bei der schließenden } am Schluss)
wird der Destruktor von selbst ausgeführt.
Wenns nur drum geht, die Verbindung zu schließen sollte eine Methode close oÄ. vorhanden sein.

edit: Die Methode heißt disconnect.
 
Die Methode heißt sweit ich weiß shutdown oder hab ich die falsche benutzt?

edit:
Ohh ja, falsche Methode, völlig falsch, Danke
 
Manuell musst du den Speicher nur aufräumen, wenn du Speicher mit new angefordert hast. Also

Code:
mysqlpp::Connection *conn = new mysqlpp::Connection( ... );

Dann musst du mit delete nachher den Speicher auch wieder freigeben:

Code:
delete conn;

Dabei wird dann auch der Destruktor des Objektes mit aufgerufen. Dein Aufruf wie du ihn oben durchgeführt hast, wird garnicht gemacht.

Gruß,
Wolf
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück