【问题标题】:how can i convert boost::array to boost::shared_ptr如何将 boost::array 转换为 boost::shared_ptr
【发布时间】:2011-06-09 10:51:35
【问题描述】:
boost::array<uint8_t,1000> buffer;
ByteBuffer b((boost::shared_ptr<uint8_t>)buffer.data(), buffer.size());

好吧,转换有点工作,但是当调试器走到方法的末尾时,它给了我一个错误,所以我想知道是否有其他方法可以转换/转换它以使其工作!

【问题讨论】:

  • 这在几个层面上都是错误的,永远不会奏效。你想做什么?

标签: c++ arrays boost shared-ptr


【解决方案1】:

这毫无意义。您正试图通过应用任意强制转换来“破解”错误。

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

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

因此,这种转换是完全不合适的,并且会导致未定义的行为......即使您可以编译它也是如此。通常,使用像 static_cast 这样的 C++ 类型转换,在这种不正确的转换时会出错,而 C 类型类型不会。

(使用 C 强制转换以使其“正常工作”很诱人,但实际上您通常做的是将头埋在沙子里并唱“啊哈”,而您的代码会变成废话。)

为什么不只是:

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

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

【讨论】:

  • @Tomalak Geret'kal boost::shared_ptr&lt;uint8_t&gt; buf(buffer.data()); ByteBuffer b(buf, buffer.size()); 它仍然给我错误Experssion: BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse)
  • @Mixed:是的,因为如上所述,这是一个无效且无意义的转换。
  • @Tomalak Geret'kal 如果 ByteBuffer 确实需要一个 shared_ptr 作为输入,那么您将不得不将数据存储在 shared_ptr 中 ,是的,它是如何我这样做的意思是将数据存储在 shared_ptr 中
  • 您仍然可以将 shared_ptr 与自定义释放器一起使用,该释放器什么都不做,但只有在指针范围存在时才有用。这种可能性特别存在于第 3 方库需要一个带有 noop 自定义释放器的 shared_ptr 作为输入组合堆栈/局部变量作为调用输入的情况。
  • @MixedCoder:我不是这么说的;您只复制了我的一半句子,然后忽略了其余部分。我说的是由shared_ptr 控制的动态内存块。确实,将 shared_ptr 与任何类型的数组(动态或其他)混合是一个完整的灾难配方,我发现所讨论的库不太可能需要这个。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    完成这项工作的唯一方法是以下。而且我认为这是一个非常糟糕的主意:

    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.
    

    【讨论】:

    • 虽然这段代码有效,但它不是解决问题的合适方法,我觉得这实际上是一个危险的建议(尽管你承认这可能是个坏主意!)
    • 具体来说,只有当您可以保证buffer 将保持在范围内,只要共享指针的任何副本仍在使用中,这才是安全的。一般来说,这很难保证;但是按预期使用shared_ptr(即控制动态分配对象的生命周期,或其他需要在使用后释放的资源)将为您解决确切的问题。
    【解决方案4】:

    什么是字节缓冲区?那是标准库类、其他地方的类还是您自己编写的类?声明是什么,实例化时期望什么类型?

    对我来说,这听起来像是一个用于管理一大块原始内存的类——但 boost:array 或 shared_array 已经这样做了。你真正想要达到什么目标?

    我认为:

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2017-10-08
      • 1970-01-01
      • 2011-05-07
      • 2013-06-26
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多