Boost logo

Boost Users :

From: Bruno Martínez (br1_at_[hidden])
Date: 2005-11-25 09:51:28


On Thu, 24 Nov 2005 07:10:41 -0200, Daniel Krügler <dsp_at_[hidden]> wrote:

> Bruno Martínez wrote:
>
>> I know. The problem is that I want incomplete types support *and*
>> release
>> member function.
>
> Use std::auto_ptr and ensure that you obey Peter Dimov's
> recommendations. I know, that the standard says, in 5.3.5
>
> "If the object being deleted has incomplete class type at the point of
> deletion and the complete class has a
> non-trivial destructor or a deallocation function, the behavior is
> undefined."
>
> and in 17.4.3.6
>
> "if an incomplete type (3.9) is used as a template argument when
> instantiating a template component."
>
> There exists no special restriction on std::auto_ptr for incomplete
> classes

I don't understand. There is a restriction. It's 17.4.3.6!

> and the main difference between std::auto_ptr and
> boost::scoped_ptr in this point is that the standard says, that "no
> diagnose is required", while boost will diagnose that due a safety belt
> in boost::checked_delete.

Yes, scoped_ptr is very well the behaved.

>> I don't seem to require a destructor in this case, for vc71 or gcc3.4:
>>
>> #include <boost/scoped_ptr.hpp>
>>
>> struct node {
>> boost::scoped_ptr<node> next;
>> };
>>
>> int main()
>> {
>> node n;
>> }
>
> This snippet does not proof, that no d'tor is needed, because node::next
> is empty for the complete program run-time. Just assign a node to next,
> and you will see...

I did, but it still works:

#include <boost/scoped_ptr.hpp>

struct node {
     boost::scoped_ptr<node> next;
     node(node* next = 0) : next(next) {}
};

int main()
{
     node n;
     n.next.reset(new node);
}

Bruno


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net