Segmentation fault in Mysql-ResultSet-Schleife
-
luggas schrieb:
Versteh ich das richtig mit exception-sicherheit meint ihr, das der code der gefahr ausläuft objekte nicht zu dealloziieren, wenn er eine exception wirft?
Ja. Denn der aktuelle Programmfluss wird ja sofort unterbrochen und es wird zum nächsten passenden catch gesprungen. Und in diesem hast du ja kein delete[]...
int main() { __int64 count = 0; try { char * buf; while ( 1 ) { buf = new char[100]; std::memset(buf, ' ', 100); count++; } } catch (std::exception & e) { std::cout << e.what() << std::endl; std::cout << "Counts: " << count << std::endl; std::cin.get(); return -1; } }Diesen Code hab ich grad mal bei mir laufen lassen, der kackt nach etwa 13-15 Millionen Durchläufen ab. Dauert keine 20 Sekunden. So kannst du dir das vorstellen. (Das try-catch ist auch nur dafür da, dass man überhaupt was sieht. Kannst ja selbst mal ausführen.
luggas schrieb:
Mit raii hab ich noch nicht gearbeitet, aber ich versuch es mal zu implementieren. Danke euch.
RAII ist so wichtig, grundlegend und mächtig, dass es wehtut wenn man es nicht verwendet... Nachholen Kollege!
-
Ich hab auch grad mal in meinem Buch von Bjarne Stroustrup gschaut und er beschreibt das auch nochmal sehr schön. Danke für den essentiellen Hinweis

-
Auch essentiell (siehe erste Antwort im Thread):
while(res->next()) { if(connections[d].sock >= 0) { flick = res->getString("M_zeit") + " | " + res->getString("M_name") + ": " + res->getString("M_msg") + "\n"; buf = new char[flick.size()]; for(int i = 0; i<flick.size();i++) { buf[i] = flick[i]; } buf[flick.size()]='\0'; send(connections[d].sock,&buf[0],flick.size(),0); } }wird zu:
while(res->next()) { if(connections[d].sock >= 0) { const std::string flick = res->getString("M_zeit") + " | " + res->getString("M_name") + ": " + res->getString("M_msg"); send(connections[d].sock, flick.c_str(), flick.size()+1, 0); } }