Search code examples
boostmemory-managementoutput-parameter

Wrapping allocated output parameters with a scoped_ptr/array


So, I have some code which looks like this:

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

To make this safer, I used a scoped_array:

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

The question is, Is there any existing way to do this using just the scoped_array, without using a temporary raw array?

I can probably write an in-place "resetter" class, just wondering if the functionality exists and I'm missing it.

Thanks, Dan


Solution

  • Why can't you just pass a reference to the scoped array to foo and call reset inside of foo?

    Alternatively have foo return a boost::shared_array/ptr as follows

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

    Edit:

    Since you cannot change foo how about the following?

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

    Alternatively you can overload foo as follows

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

    and then use the overloaded version as follows

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