2011-02-11 9 views
5

He tenido problemas al utilizar asio :: streambuf y espero que alguien me diga si estoy utilizando la clase incorrectamente. Cuando ejecuto este código de ejemplo, segfaults. ¿Por qué?Código que utiliza boost :: asio :: streambuf causa segfault

Para hacer las cosas más confusas, este código funciona en Windows (Visual Studio 2008), pero no funciona en Linux (con gcc 4.4.1).

#include <boost/asio.hpp> 
using namespace std; 

int main() 
{ 
     boost::asio::streambuf Stream; 

     // Put 4 bytes into the streambuf... 
     int SetValue = 0xaabbccdd; 
     Stream.sputn(reinterpret_cast<const char*>(&SetValue), sizeof(SetValue)); 

     // Consume 3 of the bytes... 
     Stream.consume(3); 
     cout << Stream.size() << endl; // should output 1 

     // Get the last byte... 
     char GetValue; 
     // --------- The next line segfaults the program ---------- 
     Stream.sgetn(reinterpret_cast<char*>(&GetValue), sizeof(GetValue)); 
     cout << Stream.size() << endl; // should output 0 

     return 0; 
} 
+0

posible error ... – niXman

+0

es esto simplemente 'asio :: streambuf', o' std :: streambuf' muestra el mismo comportamiento? –

+0

También obtuve núcleo descargado. por favor '#include 'para obtener el código compilado. – vissi

Respuesta

1

La forma en que he usado y visto asio :: streambuf utiliza por lo general es con std :: ostream o std :: istream, algo así como:

boost::asio::streambuf Stream; 
std::ostream os(&Stream); 
int SetValue = 0xaabbccdd; 
os.write(reinterpret_cast<const char*>(&SetValue), sizeof(SetValue)); 

No estoy seguro de por qué su El código no funciona, pero si lo anterior funciona, entonces al pasar puede mostrar alguna diferencia con respecto a tu código. ¿En qué línea se está colgando?

+0

El código se bloquea después del comentario que dice "la siguiente línea segmenta el programa". –

+0

@DylanKlomparens: OK. ¿Estaba ahí cuando respondí la pregunta? Ha sido un tiempo. :-) Suena como un error donde no se respeta el tamaño que se pasa. –

Cuestiones relacionadas