Почему сигнальное соединение делает объект SocketClient недействительным?

Я пытаюсь установить соединение TCP / TLS с классом SocketClient из Gio через giomm.

Все было хорошо, пока я не подключился к SocketClient::event_signal () сигнал с sigc::ptr_fun (),

Вот урезанный пример кода, который демонстрирует проблему:

#include <giomm/error.h>
#include <giomm/init.h>
#include <giomm/networkaddress.h>
#include <giomm/socketclient.h>
#include <glibmm/main.h>
#include <iostream>

void socket_client_event (Gio::SocketClientEvent event,
const Glib::RefPtr<Gio::SocketConnectable> &connectable,
const Glib::RefPtr<Gio::IOStream> &connection) {
}

int main () {
auto loop = Glib::MainLoop::create ();
Gio::init ();
auto network_address = Gio::NetworkAddress::create ("www.example.org", 437);
auto socket_client = Gio::SocketClient::create ();
socket_client->set_tls (true);
socket_client->signal_event ().connect (sigc::ptr_fun (&socket_client_event));
Glib::RefPtr<Gio::SocketConnection> socket_connection;
try {
socket_connection = socket_client->connect (network_address);
}
catch (const Gio::TlsError &e) {
std::cerr << e.what (). c_str () << std::endl;
return 1;
}
catch (const Gio::Error &e) {
std::cerr << e.what (). c_str () << std::endl;
return 1;
}

loop->run ();
}

Когда connect () Метод называется, я получаю этот вывод консоли:

(process:9046): GLib-GIO-CRITICAL **: g_socket_connection_connect: assertion 'G_IS_SOCKET_CONNECTION (connection)' failed

(process:9046): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed

(process:9046): GLib-GObject-CRITICAL **: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed

(process:9046): GLib-GObject-CRITICAL **: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed

И тогда ошибка сегментации заставляет программу умереть.

Я включил G_DEBUG = all и остановился при первой ошибке, но согласно обратному следу это где-то внутри connect () метод.

Любопытно, что закомментирование строки источника, соединяющей обработчик сигнала, решает проблему.

Так что же я делаю не так при подключении сигнала здесь? Почему клиент сокета недействителен после его подключения?

0

Решение

Там похоже ошибка в подсчете ссылок в glibmm или gio.

Если я ссылаюсь на объекты вручную в случае, если проблема исчезнет:

void socket_client_event (Gio::SocketClientEvent event,
const Glib::RefPtr<Gio::SocketConnectable> &connectable,
const Glib::RefPtr<Gio::IOStream> &connection) {
// Workaround for reference counting problems
if (connectable) {
connectable->reference ();
}
if (connection) {
connection->reference ();
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]