我有一个用例,我需要每次都传递boost :: shared_array。如果缓冲区没有被完全使用,我想创建一个具有相同内存空间的新指针,但是从已经写入日期的那一刻开始
示例代码:
boost::shared_array<uint8_t> buffer;
boost::shared_array<uint8_t> placeHolder;
buffer.reset(new boost::uint8_t[1024 * 1024]);
placeHolder = buffer;
uint32_t maxSize = 1024 * 1024;
uint32_t dataCopied = 0;
while(dataCopied < 1024 * 1024)
{
uint32_t bytesWritten = getData(placeHolder, maxSize); //This call might give any size of data less than boost::shared_array<uint8_t> buffer;
placeHolder = boost::shared_array<uint8_t>(buffer.get() + bytesWritten);
}
不幸的是,这对我来说没有任何线索。 这个概念中有什么建议吗?
答案 0 :(得分:2)
您不能以这种方式使用boost::shared_array
。这条线让一切都搞错了:
placeHolder = boost::shared_array<uint8_t>(buffer.get() + bytesWritten)
您创建新的shared_array,尝试在下一个循环之后立即删除[] offseted指针,从而产生未定义的行为。你不应该在这里使用共享指针,但是如果必须(比如在回调中),有一种方法可以使用别名构造函数使用std::shared_ptr
来执行它:
placeHolder = std::shared_ptr<uint8_t>(
placeHolder,
placeHolder.get() + bytesWritten);
它将保持共享状态并仅更改指针,数据缓冲区将仅被删除一次。
工作示例http://melpon.org/wandbox/permlink/9WP08ReJAijjCMHR
如果你只是必须使用boost::shared_array
,那么你可以使用什么都不做的删除器,但那是错的,如果你使用那个解决方案,你应该感觉不对。不,谢谢:http://melpon.org/wandbox/permlink/BR44arnH60znibAR