Как я могу конвертировать Boost :: массив для Boost :: shared_ptr - PullRequest
1 голос
/ 09 июня 2011
boost::array<uint8_t,1000> buffer;
ByteBuffer b((boost::shared_ptr<uint8_t>)buffer.data(), buffer.size());

хорошо, приведение вроде работает, но когда отладчик переходит к концу метода, он выдает ошибку, поэтому мне было интересно, есть ли другой способ привести / преобразовать его, чтобы он работал!

Ответы [ 4 ]

3 голосов
/ 09 июня 2011

Это не имеет смысла.Вы пытаетесь «взломать» ошибки, применяя произвольные приведения.

shared_ptr - это обертка вокруг указателя на динамически размещаемые объекты.Он управляет их динамическим временем жизни.

array - это обертка вокруг массива с длительностью автоматического хранения .Обертываемый массив uint8_t не является динамически выделяемым блоком памяти.

Таким образом, это преобразование совершенно неуместно и приведет к неопределенному поведению ... и даже если вы сможете его скомпилировать.В общем, используйте приведения C ++, такие как static_cast, что приводит к ошибкам при неправильных преобразованиях, подобных этому, в отличие от C-бросков.

(Соблазнительно использовать C-приведения, чтобы он "просто работал", нона самом деле то, что вы обычно делаете, это зарываете голову в песок и поете «аааа», а ваш код рассыпается в бессмыслицу.)

Почему бы просто:

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

Если ByteBuffer действительно требуется shared_ptr в качестве входных данных, тогда вам придется либо хранить данные в -контролируемом *1023* динамическом блоке памяти для начала, либо скопировать его в один для этогоработа.

1 голос
/ 09 июня 2011

Я не уверен, что вы пытаетесь сделать.Если вы хотите создать блок с подсчетом ссылок в 1000 uint8_t, то создайте общий массив:

boost::shared_array<uint8_t>(new uint8_t[1000])
0 голосов
/ 09 июня 2011

Что такое ByteBuffer? Это стандартный библиотечный класс, класс из другого места или тот, который вы написали сами? Что такое объявление, какого типа оно ожидает при создании?

Для меня это звучит как класс для управления фрагментом сырой памяти - но boost: array or shared_array ALREADY делает это. Что вы на самом деле хотите достичь?

Я думаю, либо:

  • ByteBuffer ожидает необработанный указатель (char *) на существующую память, и вы по ошибке используете shared_ptr (shared_ptr применяется только к одиночному объекту, выделенному 'new')
  • или, вам вообще не нужен ByteBuffer, все, что вам нужно, можно сделать с помощью boost :: array
  • или ByteBuffer ожидает shared_ptr для какого-либо объекта, а не для массива
  • или, ByteBuffer действительно хочет shared_ptr для массива, но это почти наверняка сломано. возможно сделать это, но (a) приведение не делает этого, а просто говорит: «эта память, интерпретируйте ее как объект другого рода, даже если он просто помещает данные мусора» (если только у этих двух типов нет встроенного преобразования, которого нет у array и shared_ptr) и (b) это странно и непросто, и я, честно говоря, ни на секунду не верю, что ByetBuffer ожидает этого, или, если это так, то стоит того, чтобы его использовать .
0 голосов
/ 09 июня 2011

Единственный способ получить эту работу заключается в следующем. И я думаю, что это очень плохая идея:

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.
...