2010-04-08 5 views
0

Так, У меня есть некоторый код, который выглядит следующим образом:Оберточные выделяются выходные параметры с scoped_ptr/массив

byte* ar; 
foo(ar) // Allocates a new[] byte array for ar 
... 
delete[] ar; 

Чтобы сделать это более безопасным, я использовал scoped_array:

byte* arRaw; 
scoped_array<byte> ar; 
foo(arRaw); 
ar.reset(arRaw); 
... 
// No delete[] 

вопрос Есть ли какой-либо существующий способ сделать это, используя только scoped_array, без использования временного массива?

Возможно, я могу написать собственный класс «resetter», просто задаваясь вопросом, существует ли функциональность, и я ее не хватает.

Спасибо, Dan

ответ

0

Почему вы не может просто передать ссылку на контекстный массив Foo и вызывать сброс внутри обув?

В качестве альтернативы есть Foo вернуть импульс :: shared_array/PTR следующим

boost::shared_array<byte> foo() 
{ 
    boost::shared_array<byte> a (new byte[100]); 
    return a; 
} 

boost::shared_array<byte> ar = foo(); 

Edit:

Поскольку вы не можете изменить Foo как насчет следующего?

byte* rawArray; 
foo (rawArray); 
boost::scoped_array<byte> array (rawArray); 

В качестве альтернативы вы можете перегрузить Foo следующим

boost::shared_array<byte> foo() 
{ 
    byte* rawArray; 
    foo (rawArray); 
    return boost::shared_arry<byte> (rawArray); 
} 

, а затем использовать перегруженную версию следующим

boost::shared_array<byte> array = foo(); 
+0

Foo дается, и я не хочу, чтобы изменить его. Я хочу обеспечить безопасность из сферы действия, вызывающей foo. – Danra

+0

Мне нравится предложение перегрузки, оно обеспечивает больше инкапсуляции. Благодаря! – Danra