РЕДАКТИРОВАТЬ: juan.facorro указал мне на реальную проблему, которая заключается в том, что когда сервер не работает, mytransport->open()
вызывает GlobalOutput.perror("error code")
в TSocket.cpp. Но в моем коде mytransport->open()
вызывался до инициализации GlobalOutput
см. эту ссылку для получения дополнительной информации.
У меня есть shared_ptr
с именем mytransport
, и я объявляю его так:
shared_ptr<TTransport> mytransport(new TBufferedTransport(socket));
но когда я вызываю mytransport->open();
, я получаю ошибку сегментации, и верхняя часть трассировки стека говорит:
#0 0x00000000 in ?? ()
#1 0x08068281 in apache::thrift::TOutput::perror (this=0x807a44c, message=0x9dc0e14 "TSocket::open() connect() <Host: localhost Port: 9090>", errno_copy=111) at src/thrift/Thrift.cpp:65
#2 0x080670eb in perror (errno_copy=<optimized out>, message=..., this=<optimized out>) at ./src/thrift/Thrift.h:123
#3 apache::thrift::transport::TSocket::openConnection (this=0xbfe69ea0, res=0xbfe69e9c) at src/thrift/transport/TSocket.cpp:277
Я не совсем понимаю оператор "->", но похоже, что mytransport
указывает на объект NULL
. Любые идеи?
РЕДАКТИРОВАТЬ: Если я поместил код в основной класс, он работает нормально и дает мне ошибку, которую я хочу:
TSocket::open() connect() <Host: localhost Port: 9090>Connection refused
(см. № 1 в трассировке стека). Однако когда я помещаю код в класс внутри библиотеки (которую использует основной класс), возникает ошибка сегментации. Так что, может быть, это какая-то проблема с масштабом?
mytransport
, просто используя условное выражение (if(mytransport)
{ // все в порядке...}`. - person Chad   schedule 19.07.2013