使用boost :: shared_array

时间:2015-08-28 11:36:42

标签: c++ boost

我有一个用例,我需要每次都传递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);
  }

不幸的是,这对我来说没有任何线索。   这个概念中有什么建议吗?

1 个答案:

答案 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