【发布时间】:2010-10-21 15:43:58
【问题描述】:
如何创建std::ostream 和std::istream 对象来指向我分配和管理的一块内存(我不希望流释放我的内存)。
我正在考虑使用rdbuf()->pubsetbuf() 来修改其他流之一——比如sstringstream。但是我认为stringstream 使用的streambuf 之后会释放缓冲区吗?
基本上我正在尝试将一些东西序列化到共享内存中。
谢谢。
【问题讨论】:
如何创建std::ostream 和std::istream 对象来指向我分配和管理的一块内存(我不希望流释放我的内存)。
我正在考虑使用rdbuf()->pubsetbuf() 来修改其他流之一——比如sstringstream。但是我认为stringstream 使用的streambuf 之后会释放缓冲区吗?
基本上我正在尝试将一些东西序列化到共享内存中。
谢谢。
【问题讨论】:
看看Boost.Interprocess库中的bufferstream类:
缓冲流类提供 iostream 接口与直接 在固定大小的内存中格式化 带缓冲保护的缓冲器 溢出。
【讨论】:
#include <iostream>
#include <streambuf>
//...
size_t length = 100;
auto pBuf = new char[length]; // allocate memory
struct membuf: std::streambuf // derive because std::streambuf constructor is protected
{
membuf(char* p, size_t size)
{
setp( p, p + size); // set start end end pointers
}
size_t written() {return pptr()-pbase();} // how many bytes were really written?
};
membuf sbuf( pBuf, length ); // our buffer object
std::ostream out( &sbuf ); // stream using our buffer
out << 12345.654e10 << std::endl;
out.flush();
std::cout << "Nr of written bytes: " << sbuf.written() << std::endl;
std::cout << "Content: " << (char*)pBuf << std::endl;
//...
delete [] pBuf; // free memory