我怎样才能将boost :: array转换为boost :: shared_ptr

时间:2011-06-09 10:51:35

标签: c++ arrays boost shared-ptr

boost::array<uint8_t,1000> buffer;
ByteBuffer b((boost::shared_ptr<uint8_t>)buffer.data(), buffer.size());

好吧,演员有点工作,但是当调试器到达方法的末尾时它会给我一个错误,所以我想知道是否有另一种方法来转换/转换它以使其工作!

4 个答案:

答案 0 :(得分:3)

这没有任何意义。您试图通过应用任意强制转换来“破解”错误。

shared_ptr是指向动态分配对象的指针的包装器。它管理着他们的动态生命。

array是一个包含自动存储持续时间的数组的包装器。它包装的uint8_t数组不是动态分配的内存块。

因此,这种转换是完全不合适的,并且会导致未定义的行为...即使您可以将其编译也是如此。一般情况下,使用像static_cast这样的C ++强制转换,这会像C强制转换那样以不正确的转换方式出错。

(很有可能使用C版画使其“正常工作”,但实际上你通常所做的就是将你的头埋在沙子里,唱着“啊......”而你的代码崩溃成废话。)

为什么不呢:

ByteBuffer b(buffer.data(), buffer.size());

如果ByteBuffer确实需要shared_ptr作为输入,那么您将不得不将数据存储在shared_ptr控制的动态块中要开始的内存,或将其复制到一个用于此操作。

答案 1 :(得分:1)

我不确定你要做什么。如果要创建1000 uint8_t的引用计数块,则创建共享数组:

boost::shared_array<uint8_t>(new uint8_t[1000])

答案 2 :(得分:0)

完成这项工作的唯一方法如下。我认为这是一个非常糟糕的想法:

boost::array<uint8_t,1000> buffer;
ByteBuffer b(boost::shared_ptr<uint8_t>(buffer.data(), [](uint8_t*){}), buffer.size()); // Note that the deleter does nothing.

答案 3 :(得分:0)

什么是ByteBuffer?这是一个标准的库类,来自其他地方的类,还是你自己编写的类?什么是声明,它在实例化时期望什么类型?

听起来像是一个用于管理大块原始内存的类 - 但是boost:array或shared_array ALREADY就是这样做的。你究竟想要实现什么目标?

我认为:

  • ByteBuffer期望原始指针(char *)到现有内存,而你错误地使用shared_ptr(shared_ptr仅适用于由'new'分配的单个对象)
  • 或者,你根本不需要ByteBuffer,你需要的一切都可以通过boost :: array
  • 来完成
  • 或者,ByteBuffer期望shared_ptr到某种对象而不是数组
  • 或者,ByteBuffer确实想要一个shared_ptr到一个数组,但这几乎肯定会被打破。这样做是可能的,但是(a)转换不会这样做,只是说“这个内存,把它解释为它是另一种对象,即使它只是放入垃圾数据“(除非这两种类型有一个内部转换,哪个数组和shared_ptr没有)和(b)它奇怪而又繁琐但老实说我不相信ByetBuffer期望这一点,或者如果它确实如此,它值得使用。