Бережливость: -› оператор дает мне ошибку сегментации

РЕДАКТИРОВАТЬ: 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 в трассировке стека). Однако когда я помещаю код в класс внутри библиотеки (которую использует основной класс), возникает ошибка сегментации. Так что, может быть, это какая-то проблема с масштабом?


person woojoo666    schedule 18.07.2013    source источник
comment
Это не то, что я получил бы от этого стека вызовов. Вы можете проверить действительность указателя, содержащегося в my mytransport, просто используя условное выражение (if(mytransport) { // все в порядке...}`.   -  person Chad    schedule 19.07.2013
comment
спасибо, я пробовал это, но я все еще получаю ошибку сегментации. Есть идеи, что может быть реальной причиной?   -  person woojoo666    schedule 19.07.2013


Ответы (1)


Основываясь на трассировке стека и после некоторых исследований кода для TSocket.cpp, строка 182 показывает точно такое же сообщение об ошибке в методе openConnection(). errno_copy получает свое значение от errno, имеющего значение 111. Согласно этому, это значение соответствует ECONNREFUSED. Поэтому я бы проверил соединение на другом конце.

person juan.facorro    schedule 18.07.2013
comment
Я знаю, что ошибка связана с подключением, я специально не запускал сервер. Проблема в том, что я получаю сообщение об ошибке сегментации вместо обычной ошибки «Отказано в соединении». - person woojoo666; 19.07.2013
comment
Итак, является ли вызов open() оберткой для какой-то другой библиотеки, которая выдает исключение? - person Chad; 19.07.2013
comment
Я просмотрел код TSocket.cpp и нашел в строке 182 GlobalOutput.perror("error message goes here"), но GlobalOutput еще не был инициализирован, что и вызвало ошибку. Спасибо, что указали мне правильное направление! - person woojoo666; 19.07.2013