$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-12-30 19:19:49
Adam Peterson wrote:
> Essentially, I'm passing a function a scoped_array and I want to
> assign data to it.  It seems like there isn't a way to copy a chunk
> of data to the scoped_array except when it is created.  Functionaly
> I'm where I want to be, but I'm thinking I must be misunderstanding
> the correct way to do this.  I'm getting the data from a DLL that
> allocates its own memory, so I have to copy the data locally, then
> call the DLL's function to release the memory.  Is this the best way
> to accomplish what I'm after?
It seems to me that you've missed scoped_array::reset:
> scoped_array<APPRIGHTITEM> saTemp ( sap );
> saGroups.swap( saTemp );
is exactly what saGroups.reset( sap ) would do.
You could also return a shared_array to avoid the local copy:
shared_array<APPRIGHTITEM> blah( ... )
{
    LPAPPRIGHTITEM  lp = NULL;
    DWORD dw = 0;
    get_my_data( &lp, &dw );
    if( lp )
    {
        return shared_array<APPRIGHTITEM>( lp, FreeList );
    }
    else
    {
        return shared_array<APPRIGHTITEM>();
    }
}
Depending on how get_my_data and FreeList are specified, you may not need 
the if. This approach also makes the code exception-safe; the original seems 
to leak the list when new throws.
And of course if you needed the item count, you would've returned a 
std::vector. :-)