C++ 如何将boost::array转换为boost::shared_ptr boost::数组缓冲区; ByteBuffer b((boost::shared_ptr)buffer.data(),buffer.size());

C++ 如何将boost::array转换为boost::shared_ptr boost::数组缓冲区; ByteBuffer b((boost::shared_ptr)buffer.data(),buffer.size());,c++,arrays,boost,shared-ptr,C++,Arrays,Boost,Shared Ptr,嗯,强制转换可以工作,但是当调试程序运行到方法的末尾时,它会给我一个错误,所以我想知道是否有其他方法可以强制转换/转换它,使其工作 这毫无意义。您正试图通过应用任意类型转换来“破解”错误 shared_ptr是指向动态分配对象指针的包装器。它管理它们的动态生命周期 array是一个围绕数组的包装器,具有自动存储持续时间。它包装的uint8\t数组不是动态分配的内存块 因此,这种转换是完全不合适的,将导致未定义的行为。。。即使你可以编译它。一般来说,使用C++的方式类似于StasyType Cas

嗯,强制转换可以工作,但是当调试程序运行到方法的末尾时,它会给我一个错误,所以我想知道是否有其他方法可以强制转换/转换它,使其工作

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

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

array
是一个围绕数组的包装器,具有自动存储持续时间。它包装的
uint8\t
数组不是动态分配的内存块

因此,这种转换是完全不合适的,将导致未定义的行为。。。即使你可以编译它。一般来说,使用C++的方式类似于StasyType Case<代码>,它在错误转换中出错,就像C投不这样做的那样。

(使用C类型转换很有诱惑力,这样它“就行了”,但实际上你通常做的是把头埋在沙子里,唱“啊哈”,而你的代码却变得毫无意义。)

为什么不只是:

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

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

这没有意义。您正试图通过应用任意类型转换来“破解”错误

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

array
是一个围绕数组的包装器,具有自动存储持续时间。它包装的
uint8\t
数组不是动态分配的内存块

因此,这种转换是完全不合适的,将导致未定义的行为。。。即使你可以编译它。一般来说,使用C++的方式类似于StasyType Case<代码>,它在错误转换中出错,就像C投不这样做的那样。

(使用C类型转换很有诱惑力,这样它“就行了”,但实际上你通常做的是把头埋在沙子里,唱“啊哈”,而你的代码却变得毫无意义。)

为什么不只是:

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

如果
ByteBuffer
确实需要一个
shared\u ptr
作为输入,那么您必须首先将数据存储在
shared\u ptr
控制的动态内存块中,或者将其复制到一个动态内存块中以进行此操作。

实现此功能的唯一方法如下。我认为这是一个非常糟糕的主意:

ByteBuffer b(buffer.data(), buffer.size());
boost::数组缓冲区;
ByteBuffer b(boost::shared_ptr(buffer.data(),[](uint8_t*){},buffer.size());//请注意,删除程序不执行任何操作。

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

ByteBuffer b(buffer.data(), buffer.size());
boost::数组缓冲区;
ByteBuffer b(boost::shared_ptr(buffer.data(),[](uint8_t*){},buffer.size());//请注意,删除程序不执行任何操作。

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

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.
boost::共享阵列(新uint8\U t[1000])

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

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.
boost::共享阵列(新uint8\U t[1000])

什么是ByteBuffer?这是一个标准的库类,一个来自其他地方的类,还是您自己编写的类?声明是什么,实例化时需要什么类型

对我来说,这听起来像是一个管理一大块原始内存的类——但boost:array或shared_array已经做到了这一点。你到底想做什么

我认为:

  • ByteBuffer需要一个指向现有内存的原始指针(char*),而您错误地使用了shared_ptr(shared_ptr仅适用于由“new”分配的单个对象)
  • 或者,您根本不需要ByteBuffer,您需要的一切都可以通过boost::array完成
  • 或者,ByteBuffer希望共享的ptr是某种类型的对象,而不是数组
  • 或者,ByteBuffer确实希望对一个数组使用一个共享的ptr,但这几乎肯定是失败的。这样做是可能的,但(a)强制转换不起作用,只是说“这个内存,把它当作另一种对象来解释,即使它只是把垃圾数据放进去”(除非这两种类型有内置转换,而array和shared_ptr没有)和(b)这很奇怪,也很微妙,老实说,我一秒钟也不相信ByetBuffer会期待这个,或者如果它期待的话,它值得使用

什么是ByteBuffer?这是一个标准的库类,一个来自其他地方的类,还是您自己编写的类?声明是什么,实例化时需要什么类型

对我来说,这听起来像是一个管理一大块原始内存的类——但boost:array或shared_array已经做到了这一点。你到底想做什么

我认为:

  • ByteBuffer需要一个指向现有内存的原始指针(char*),而您错误地使用了shared_ptr(shared_ptr仅适用于由“new”分配的单个对象)
  • 或者,您根本不需要ByteBuffer,您需要的一切都可以通过boost::array完成
  • 或者,ByteBuffer希望共享的ptr是某种类型的对象,而不是数组
  • 或者,ByteBuffer确实希望对一个数组使用一个共享的ptr,但这几乎肯定是失败的。这样做是可能的,但(a)强制转换不起作用,只是说“这个内存,把它当作另一种对象来解释,即使它只是把垃圾数据放进去”(除非这两种类型有内置转换,而array和shared_ptr没有)和(b)这很奇怪,也很微妙,老实说,我一秒钟也不相信ByetBuffer会期待这个,或者如果它期待的话,它值得使用
这就是wr