Boost logo

Boost Users :

From: Daniel Krügler (dsp_at_[hidden])
Date: 2005-11-24 04:10:41


Bruno Martínez wrote:
> On Wed, 23 Nov 2005 08:34:26 -0200, Peter Dimov <pdimov_at_[hidden]> wrote:
>
>
>>Bruno Martínez wrote:
>>
>>>Hi.
>>>
>>>I had the same question that is answered there, but the answer didn't
>>>fit my problem. I'm using scoped_ptr<node> inside node itself, so
>>>node is incomplete at the point of use. That forbids using auto_ptr,
>>>IIUC.
>>
>>You can use a scoped_ptr member with an incomplete type, as long as you
>>include out of line default constructor (if you need one) and destructor.
>
>
> 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 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.

>
> 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....

Greetings from Bremen,

Daniel


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