Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > C++ Moderated > Re: Smart-point...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 2 of 7 Topic 9545 of 9823
Post > Topic >>

Re: Smart-pointer pimpl and compiler-generated destructors.

by Travis Vitek <travis.vitek@[EMAIL PROTECTED] > Apr 25, 2008 at 03:48 PM

On Apr 25, 9:53 am, rwf_20 <rfr...@[EMAIL PROTECTED]
> wrote:
>
> myClass::myClass() : m_pimpl(std::auto_ptr<myStruct>(new myStruct()))
> { }

You should be able to simplify that to

   myClass::myClass() : m_pimpl(new myStruct())
   { }

> This compiles just fine, until I try to use myClass elsewhere.  At
> this point, I get warnings like:
>
> "deletion of pointer to incomplete type 'myStruct'; no destructor
> called"
>
> I guess I understand why this happens, and it's fixed by declaring a
> destructor for myClass and defining it in the .cpp file.  It just irks
> me that I need to define a blank destructor (the same thing the
> compiler should generate) to make this work.

Because the C++ standard allows pointers to incomplete class types to
be deleted but if the class has a non-trivial destructor or a class
operator delete the behavior is undefined.

The problem is that if you don't define the destructor in the cpp, the
compilers implicit definition will be used. This implicit definition
will be as if it were declared inline in the header file. The
destructor for myClass will call the destructor for the auto_ptr,
which will call delete on a pointer to the incomplete type
myClass::myStruct. The result is undefined behavior.

If you define the destructor of myClass after the definition of the
nested class myClass::myStruct, then everything will work as expected
and you'll avoid the warning that you are seeing.

> Googling this issue, I
> findhttp://www.gotw.ca/publications/using_auto_ptr_effectively.htm,
> in which Mr. Sutter demonstrates this same code and adds the comment:
>
> "In fact, if there's no other reason for explicitly writing a
> destructor, we don't need to bother with a custom destructor at all
> any more."
>

This is one of the 'other reasons' he is talking about. It is a
special case.

Travis


-- 
      [ See http://www.gotw.ca/resources/clcm.htm
for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]
 




 7 Posts in Topic:
Smart-pointer pimpl and compiler-generated destructors.
rwf_20 <rfrenz@[EMAIL   2008-04-25 10:53:17 
Re: Smart-pointer pimpl and compiler-generated destructors.
Travis Vitek <travis.v  2008-04-25 15:48:58 
Re: Smart-pointer pimpl and compiler-generated destructors.
nickf3 <nickf3@[EMAIL   2008-04-25 16:13:20 
Re: Smart-pointer pimpl and compiler-generated destructors.
acehreli@[EMAIL PROTECTED  2008-04-25 16:13:19 
Re: Smart-pointer pimpl and compiler-generated destructors.
=?ISO-8859-1?Q?Daniel_Kr=  2008-04-26 03:28:12 
Re: Smart-pointer pimpl and compiler-generated destructors.
Martin T <0xCDCDCDCD@[  2008-04-26 03:27:48 
Re: Smart-pointer pimpl and compiler-generated destructors.
Carl Barron <cbarron41  2008-04-26 03:34:41 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Thu Jul 24 1:40:42 CDT 2008.