Fur*_*ead 1 c++ heap stack pointers exception
希望你有一个美好的一天.
我正在开一个包装Berkley C Networking API的类,到目前为止我只有一个TCP服务器/客户端.
我具有讽刺意味的问题不是网络,而是堆栈和堆.也许我完全不理解它,但是当我使用类似的东西时:
ClientSocket *mysock = new ClientSocket();
并且只使用 - >运算符调用函数,它完全正常 - 如果发生错误,我的SocketException类没有被捕获.
但是,当我使用时:在使用
ClientSocket mysock;
函数调用函数时抛出任何异常.运营商,它显示:
terminate called after throwing an instance of 'SocketException'
Aborted
然后把我扔回终端提示.
忘了添加,我在try/catch块中包装调用.
我知道第一个例子是使用'new'关键字返回指向堆上新ClientSocket实例的指针,第二个示例是堆栈,但我不知道问题.
我在想我错过了关于指针/引用/堆栈/堆的东西,但我不知道发生了什么.代码经常运行得很好,但如果抛出任何异常....> :(
编辑:在链接页面上,Client.cxx和Server.cxx是示例文件!谢谢你指出这一点,埃里克.对此的帮助将不胜感激.这个项目的来源是:
所有文件的链接:http ://furryhead.co.cc/problem.html
(我无法粘贴超过2个链接,我有4个文件,所以这必须做到有人可以将链接合并到我的帖子中)注意:Socket.cxx相当大,因为它包含ServerSocket,ClientSocket和SocketException定义.
编译所有上述文件的命令是:
g ++ -c Socket.cxx -o Socket.o
g ++ -c Server.cxx -o Server.o
g ++ -c Client.cxx -o Client.o
g ++ Server.o Socket.o -o server
g ++ Client.o Socket.o -o client
谢谢!
根据Jon的建议,我没有更新,我查找了套接字函数的文档,它现在有更好的错误报告 - 我检查'errno'变量并基于此抛出异常.(那,我没有把它设置为非阻塞......;)) - 只是想更新并说声谢谢!:d
对我来说这听起来像是一个异常被抛出的合理原因,并且在堆栈展开期间,某些对象(可能ClientSocket是?)的析构函数抛出.由于运行时无法以任何有意义的方式解决这种情况(同时"抛出"两个异常),因此terminate调用该函数并关闭程序.
没有答案的问题是为什么一些析构函数会抛出,如果它所属的对象被分配在堆栈上.但要回答这个问题需要更多数据.也许你可以深入挖掘并测试我的假设?
顺便说一句,如果这确实是这样的,由于没有析构函数应该永远 扔 东西,我们可以得出结论,违规类是致命的缺陷.
更新:似乎我在赚钱.
你的类Socket的析构函数调用close,并且close可以抛出.这是一个严重的编程错误.你应该close在析构函数中包装调用
try {
close();
}
catch(...)
{ /* this space intentionally left blank */ }
Run Code Online (Sandbox Code Playgroud)
崩溃将消失.
第二次更新(不再崩溃)
如果recv返回-1,则表示套接字处于非阻塞模式,并且当前没有可接收的数据.这不是错误,而是一个功能.你不应该在那里抛出异常.你应该做什么完全取决于你是否想要在阻塞或非阻塞模式下使用套接字.
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |