tags:

views:

833

answers:

2
+4  Q: 

TR1 Shared Arrays

I've had a hard time finding references in the TR1 documentation concerning shared arrays. The Boost documentation is fairly clear that there is a significant difference between the C++ "new" and "new[]" expressions. The shared_ptr template is meant to correctly hold a pointer to a dynamically allocated objected created using "new". The shared_array template is meant to correctly hold a pointer to a dynamically allocated array using "new[]".

I'm in the process of updating some code to use the TR1 shared_ptr template and associated functions, but I've found no mention of shared_array. Does the TR1 shared_ptr implementation differentiate between "new" and "new[]", and destroy those pointers correctly? As far as I can tell from looking at the TR1 spec, it appears it does not. If this is the case, should I still be using the boost shared_array template for "new[]" style allocations?

+11  A: 

That is correct, there is no shared_array in TR1.

You can, however, provide your own deleter object to perform "delete []" if you wish using this constructor:

template<class Other, class D>
   shared_ptr(Other* ptr, D dtor);

For example:

template<typename T>
struct my_array_deleter
{
   void operator()(T* p)
   {
      delete [] p;
   }
};

shared_ptr<int> sp(new int[100], my_array_deleter<int>());
Brian Neal
this looks good on the surface, but does shared_ptr provide an operator[]? I don't think boost's does.
Evan Teran
TR1 shared_ptr does not. You can always "int* p = sp.get(); p[5] = 42;" Are you sure you need shared_array though? Vector or string are often sufficient.
Brian Neal
A: 

I suspect that most people who use TR1 do not use arrays, but use vector<> instead.

I haven't read TR1, so I'll answer on the basis of Boost, which is probably good enough. boost::shared_ptr<> deals with individual objects, and not arrays. That's what boost::shared_array<> is for.

If you're using arrays, and have reasons to convert to shared_array<> but not to vector<>, use shared_array<>.

David Thornley
But even boost::shared_ptr<> can be instantiated with a custom deleter that could do a "delete []". This, I believe, is why TR1 did not adopt boost::shared_array.
Brian Neal
well, c++1x also hasn't adopted shared_array. i don't know why. however, they have an unique_ptr<T>. if you use unique_ptr<T[]>, then it uses delete[] to free. i don't know why they don'T provide they for shared_ptr too. like shared_ptr<int[]> .
Johannes Schaub - litb