2013-04-02 4 views
2

У меня есть объект потока, который предоставляет методы GetBuffer() и GetBufferSize(). Метод GetBuffer возвращает необработанный указатель uint8_t. Я хочу передать (по значению) этот буфер другому объекту, который ожидает shared_array<uint8_t>. Я использую boost (что я довольно новичок), и это то, что я придумал.Есть ли лучший способ выделения/копирования shared_array

// relevant protos for a and b 
void BClass::SetData(shared_array<uint8_t> data, size_t data_len); 
uint8_t* AClass::GetBuffer(void); 
size_t AClass::GetBufferSize(void); 

AClass a; 
BClass b; 

shared_array<uint8_t> data = shared_array<uint8_t>(new uint8_t[a.GetBufferSize()]); 
memcpy(data.get(), a.GetBuffer(), a.GetBufferSize()); 
b.SetData(data, a.GetBufferSize()); 

Похоже, что должно быть что-то похожее на make_shared boost, которое могло бы очистить это. Мне что-то не хватает?

ответ

0

Boost 1.53we've got make_shared for arrays. Так что ваш код может выглядеть следующим образом:

shared_ptr<uint8_t[]> data = make_shared<uint8_t[]>(a.GetBufferSize()); 

Конечно, тогда вам нужно изменить BClass::SetData подпись, чтобы принять shared_ptr вместо shared_array.

+0

Это удаляет вызов на новый, но «memcpy» по-прежнему необходимо выполнять отдельно. Кроме того, не массивы в shared_ptr new в 1.53? IIRC, мы используем Boost 1.33 – benf

+0

@benf Да, это новая функция в boost1.53. Что касается 'memcpy', вы можете использовать' std :: copy', но в этом случае это не имеет значения. –

Смежные вопросы