Bug des Compilers oder der Boost-Bibliothek?

8

Dieses Programm (es wurde von einem größeren Programm eingegrenzt) stürzt immer nach kompiliert in vs2008 Release (Win32) -Modus unter Windows 7. Ich bin nicht mit Assembly-Code vertraut und weiß nicht, es ist ein Bug Compiler oder Boost :: ends_with oder boost :: asio :: buffers_iterator. Es kann ohne Probleme mit g ++ in Ubuntu kompiliert und ausgeführt werden.

Die Leute sagten, es sei sehr unwahrscheinlich, dass es sich um einen Fehler des Compilers handeln würde, aber wenn er in Debug-Modus kompiliert wird (oder die Optimierung deaktiviert), verschwindet das Problem.

Ich habe dieses Problem für einige Stunden festgefahren. Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

%Vor%     
user869210 31.10.2012, 08:51
quelle

2 Antworten

1

Edit: Ich habe den Code falsch gelesen, sorry.

Ihre Cursor- und Ende-Iteratoren zeigen auf ungültigen Speicher. Sie haben den zugrunde liegenden Streambuf, der während der Kopie neu zugewiesen wurde, in den Ausgabeiterator geändert. asio streambuf lässt dich aus Performance-Gründen auf den rohen Speicher zugreifen, aber der Nachteil ist, dass du dich um solche Dinge sorgen musst.

Debuggen und Freigeben wird die Art und Weise ändern, wie sich Zuweisung und Freigabe verhalten, was die zugrunde liegende Größe des zugewiesenen Blocks betrifft und wie der Speicher eingezäunt, geschützt, initialisiert, ausgerichtet usw. werden kann.

Konstruieren Sie Ihre Iteratoren nach dem Kopiervorgang, um Ihr Problem zu beheben.

    
adzm 11.11.2012 20:12
quelle
1

Es funktioniert nicht, da 'range_t r (cursor, end)' ein Bereich von "Puffern" ist, nicht ein Bereich von Zeichen. Sie vergleichen also eine Liste von Pufferzeigern mit jedem Zeichen in LINE_END_MARK.

Wenn im Freigabemodus unter win32 abstürzt, weil in Windows Sie einen Nullzeiger de-referenzieren, der den Absturz verursacht.

Boost Asio hat dieses Konzept von mehreren Puffern, aber derzeit wird es nicht wirklich verwendet. Wenn Sie sich die Implementierung anschauen, wird nur 'const_buffers_1' oder 'mutable_buffers_1' verwendet, was im Grunde eine Liste von 1 Puffer ist.

Ich nehme an, Sie wollen den Inhalt des Puffers vergleichen, nicht eine Liste von Pufferbereichen.

Sie möchten also etwas wie:

%Vor%     
Shane Powell 12.11.2012 10:21
quelle

Tags und Links