小编cri*_*nus的帖子

streambuffer实现的std :: endl和'\n'之间的差异

我目前正在尝试实现stringbuf的子类,以允许缓冲区为特定字符(在我的情况下为'\n')进行标记化,并在发生此字符时执行操作(之后将消息转储到记录器并清除缓冲区)案件).为了实现这个目标,我重写了sputc(实现了对'\n'的监视)和xsputn(确实使用了sputc,因为GCC实现默认情况下似乎没有这样做).出于调试目的,我让sputc写出传递给stdout的每个字符.

现在这是我的问题:如果我使用类似的东西

mystream << "Some text" << std::endl;
Run Code Online (Sandbox Code Playgroud)

sputc接收除了应该由std :: endl引入的'\n'之外的每个字符,因此不会执行预期的操作,因为'\n'没有被传递.如果我使用类似的东西

mystream << "Some text" << '\n';
Run Code Online (Sandbox Code Playgroud)

甚至

mystream << "Some text" << "\n" << std::flush;
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,我的sputc实现获得'\n'字符.

所以我的问题是:两个代码行不应该对后面的stringbuf完全相同,如果没有,我必须覆盖哪些其他方法来获取'\n'?

c++ stringbuffer endl

10
推荐指数
1
解决办法
330
查看次数

C++:抛出异常时堆栈不会被解除

你好,

我的一个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与服务器通信并显示检索到的数据.

我的问题是:使用共享对象时堆栈展开是否存在限制,或者我应该在哪里找到我错过的东西以使其正常工作?

c++ shared exception object

1
推荐指数
1
解决办法
241
查看次数

标签 统计

c++ ×2

endl ×1

exception ×1

object ×1

shared ×1

stringbuffer ×1