为什么信号连接会使套接字客户端对象失效?
Why does signal connection invalidate the SocketClient object?
我正在尝试通过 giomm 与 Gio 的 SocketClient 类建立 TCP/TLS 连接。
一切都很好,直到我用sigc::ptr_fun ()
连接到SocketClient::event_signal ()
信号。
下面是演示该问题的精简示例代码:
#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 ()
方法中的某个地方。
奇怪的是,注释掉连接信号处理程序的源代码行可以解决问题。
那么我在这里连接信号时做错了什么?为什么套接字客户端连接后无效?
在 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 ();
}
}
相关文章:
- 为什么信号连接会使套接字客户端对象失效?
- AccessObjectFromPoint 返回客户端对象而不是复选框
- 为什么我不能将 new创建的客户端对象分配给unique_ptr
- 细分故障 - 将对象通过服务器发送到客户端
- 使用C++客户端 - Python 服务器通过 Zmq 发送 JSON 对象
- 应由库或客户端代码删除已加载库中的对象实例
- 在 Java 客户端中创建 Mat 对象,使用 opencv 从C++服务器发送
- 如果在 DLL/Lib 中定义了对象,是否可以在客户端中实例化对象?
- 如何防止客户端修改列表对象
- C++面向对象的客户端套接字应用程序设计
- 视觉对象 我的客户端连接类出了什么问题?C++
- 多线程客户端中 COM 对象的初始化和实例化
- 调用的对象已与其客户端断开连接
- 使用 UDP 传输对象黑白客户端/服务器
- 如何从连接到共享打印对象的客户端的服务器获取所有IP(或用户名)
- 如何从C++中的函数返回对象引用,以及如何从客户端调用该函数
- 使用Google Mock来模拟在客户端代码中复制的对象
- 如何将在客户端内部创建的类的对象传递给服务器
- 向给定remote_endpoint对象和套接字的客户端发送数据包
- 如何在进程外客户端中获得免注册的COM对象代理