cri*_*nus 1 c++ shared exception object
你好,
我的一个C++项目中有一个非常奇怪的问题:我写了一个C++ Socket包装器,尝试连接到给定的主机和端口(通过IPv4/TCP)并抛出SocketException(派生自std :: runtime_error),如果发生错误(例如"拒绝连接").正确捕获异常并按预期将错误消息写入控制台,但显然我的Socket类的析构函数未被调用(它也应该向std :: cerr输出消息,但只有连接有效时才会显示消息如果Socket离开堆栈,稍后会被销毁,例如在尝试使用套接字的函数结束时.析构函数应该关闭封装的套接字,但是在抛出异常时套接字保持打开状态(你可以用lsof作为未知类型的套接字看到它),因此析构函数中似乎根本没有执行任何代码.由于我无法用一个简单的测试用例重现这个问题,我的猜测是它在某种程度上与我项目的相当复杂的结构有关:我有一个核心应用程序包含Socket类的代码并提供一个Singleton类提供实现用于通信的协议并返回请求结果的方法,对这些方法之一的每次调用都会生成自己的Socket实例,并为其提供有关要使用的主机和端口的必要信息.为了简化套接字生成和管理,使用std :: auto_ptr,如果方法已经完成并且清理了堆栈,它应该删除Socket,这可以根据控制台输出正常工作,但它应该在抛出异常时以相同的方式工作,至少到目前为止我的意见是什么.核心能够通过dlopen以共享对象格式加载插件,并通过共享对象中的extern C声明函数获取指向插件的类实例的指针.此实例现在使用核心提供的Singleton与服务器通信并显示检索到的数据.
我的问题是:使用共享对象时堆栈展开是否存在限制,或者我应该在哪里找到我错过的东西以使其正常工作?
如果从构造函数抛出异常,则不会调用析构函数.
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |