Go Back   Rhinocerus > Newsgroup > Newsgroup comp.language.c++

Reply
 
Thread Tools Display Modes
  #1 (permalink)  
Old 07-13-2012, 12:09 PM
pritesh kadam
Guest
 
Posts: n/a
Default Runtime Error for virtual derived class destructor

I declared derived class destructor as virtual.

CODE:

#include<iostream>
using namespace std;

class Base{ //Base class
int x; public:
Base()
{cout<<"Base Constructed\n";}
~Fred() //Base destructor not virtual
{cout<<"Base Destructed\n";}
};

class Der: public Base //Derived
{
public:
Der(){cout<<"Derived Constructor"; }

virtual ~Der() //Derived class destructor virtual
{ cout<<"Derived Destructed";}
};

int main()
{
Base *f=new Der();
delete f;

}


It gets compiled correctly. But on execution, following is o/p :

O/p

Base Constructed
Derived Constructor
Base Destructed
*** glibc detected *** ./trial: free(): invalid pointer: 0x0957b00c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x19b591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x19cde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x19fecd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xd9e741]
../trial[0x80487fe]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x146bd6]
../trial[0x8048701]
======= Memory map: ========
00113000-0012e000 r-xp 00000000 08:06 390404 /lib/ld-2.11.1.so
0012e000-0012f000 r--p 0001a000 08:06 390404 /lib/ld-2.11.1.so
0012f000-00130000 rw-p 0001b000 08:06 390404 /lib/ld-2.11.1.so
00130000-00283000 r-xp 00000000 08:06 394800 /lib/tls/i686/cmov/libc-2.11.1.so
00283000-00284000 ---p 00153000 08:06 394800 /lib/tls/i686/cmov/libc-2.11.1.so
00284000-00286000 r--p 00153000 08:06 394800 /lib/tls/i686/cmov/libc-2.11.1.so
00286000-00287000 rw-p 00155000 08:06 394800 /lib/tls/i686/cmov/libc-2.11.1.so
00287000-0028a000 rw-p 00000000 00:00 0
00538000-0055c000 r-xp 00000000 08:06 394808 /lib/tls/i686/cmov/libm-2.11.1.so
0055c000-0055d000 r--p 00023000 08:06 394808 /lib/tls/i686/cmov/libm-2.11.1.so
0055d000-0055e000 rw-p 00024000 08:06 394808 /lib/tls/i686/cmov/libm-2.11.1.so
0059e000-005bb000 r-xp 00000000 08:06 390462 /lib/libgcc_s.so.1
005bb000-005bc000 r--p 0001c000 08:06 390462 /lib/libgcc_s.so.1
005bc000-005bd000 rw-p 0001d000 08:06 390462 /lib/libgcc_s.so.1
008f2000-008f3000 r-xp 00000000 00:00 0 [vdso]
00ce3000-00dcc000 r-xp 00000000 08:06 262327 /usr/lib/libstdc++.so.6.0.13
00dcc000-00dcd000 ---p 000e9000 08:06 262327 /usr/lib/libstdc++.so.6.0.13
00dcd000-00dd1000 r--p 000e9000 08:06 262327 /usr/lib/libstdc++.so.6.0.13
00dd1000-00dd2000 rw-p 000ed000 08:06 262327 /usr/lib/libstdc++.so.6.0.13
00dd2000-00dd9000 rw-p 00000000 00:00 0
08048000-08049000 r-xp 00000000 08:06 137559 /home/pritesh/C/trial
08049000-0804a000 r--p 00000000 08:06 137559 /home/pritesh/C/trial
0804a000-0804b000 rw-p 00001000 08:06 137559 /home/pritesh/C/trial
0957b000-0959c000 rw-p 00000000 00:00 0 [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b77f9000-b77fb000 rw-p 00000000 00:00 0
b7809000-b780c000 rw-p 00000000 00:00 0
bf899000-bf8ae000 rw-p 00000000 00:00 0 [stack]
Aborted
pritesh@pritesh-desktop:~/C$

Reply With Quote
Alt Today
Advertising
 
and become member of Rhinocerus
Standard Sponsored Links

  #2 (permalink)  
Old 07-13-2012, 12:50 PM
Victor Bazarov
Guest
 
Posts: n/a
Default Re: Runtime Error for virtual derived class destructor

On 7/13/2012 8:09 AM, pritesh kadam wrote:
> I declared derived class destructor as virtual.
>
> CODE:
>
> #include<iostream>
> using namespace std;
>
> class Base{ //Base class
> int x; public:
> Base()
> {cout<<"Base Constructed\n";}
> ~Fred() //Base destructor not virtual


I think you meant

~Base()

> {cout<<"Base Destructed\n";}
> };
>
> class Der: public Base //Derived
> {
> public:
> Der(){cout<<"Derived Constructor"; }
>
> virtual ~Der() //Derived class destructor virtual
> { cout<<"Derived Destructed";}
> };
>
> int main()
> {
> Base *f=new Der();
> delete f;
>


Since 'Base' class destructor is not virtual, deleting a derived object
via the base class pointer has undefined behavior. A "run-time error"
is totally acceptable result since the language does not impose any
particular behavior in this case. Just like absence of any "error"
would be, as well. Or your hard drive formatted. Or nasal demons.

Read up on "undefined behavior".

> }
>
>
> It gets compiled correctly. But on execution, following is o/p :
>
> O/p
>
> Base Constructed
> Derived Constructor
> Base Destructed
> *** glibc detected *** ./trial: free(): invalid pointer: 0x0957b00c ***
>[...]


V
--
I do not respond to top-posted replies, please don't ask


Reply With Quote
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off




All times are GMT. The time now is 05:03 AM.


Copyright ©2009

LinkBacks Enabled by vBSEO 3.3.0 RC2 © 2009, Crawlability, Inc.