c++/523: static object never destructed

Benjamin Kosnik bkoz@redhat.com
Mon Sep 11 13:39:00 GMT 2000

Hmm. I can reproduce this with both gcc-2.95.2 and current gcc. I've
abstracted out your testcase so that iostreams are not necessary. 

New code that demonstrates this is appended, below.

It looks like a non-templatized struct will result in ~A being called,
but the same class as a template will not call ~A: very strange.


using class B, no C:

setting a breakpoint in ~A gives:

Breakpoint 2, A::~A (this=0x0, __in_chrg=65535) at list02.cc:23
(gdb) where
#0  A::~A (this=0x0, __in_chrg=65535) at list02.cc:23
#1  0x804863d in global destructors keyed to main () at list02.cc:21
#2  0x80484dc in __do_global_dtors_aux ()
#3  0x8048771 in _fini ()
#4  0x400b0f56 in ?? ()
#5  0x4009db6e in ?? ()

Using the non-templatized C class for B, ~A does not get hit.

Looking at the C-case assembly for main:

	movl	%ebp, %esp
	popl	%ebp
	.size	 main,.Lfe1-main
	.section	.gnu.linkonce.t.__t1C1Zi,"ax",@progbits
	.align 16
	.weak	__t1C1Zi
	.type	 __t1C1Zi,@function

And B:

	movl	%ebp, %esp
	popl	%ebp
	.size	 main,.Lfe1-main
	.local	__ioinit
	.comm	__ioinit,4,4
.globl _1B.a
	.type	 _1B.a,@object
	.size	 _1B.a,1
	.zero	1
	.align 16
	.type	 __static_initialization_and_destruction_0,@function

Here's some sample code:

// start
class ios_base
  class Init
    friend class ios_base;
    int i;
    Init(int j = 0): i(j) { };
    ~Init() { };
    void inc_i(int arg) { i += arg; }
    void dec_i(int arg) { i -= arg; }
    int get_i() { return i; }

static ios_base::Init __ioinit;

struct A 
  void f(){};
  A(){ __ioinit.inc_i(1); }
  ~A(){ __ioinit.dec_i(1); }

// non-templatized
#if 1
struct B 
  B(){ a.f(); }
  static A a;

A B::a;

// templatized
template<class T>
struct C
  C(){ a.f(); }
  static A a;

template <class T> A C<T>::a;
typedef C<int> B;

int main()
  B b;
  return 0;

Anyway. I'll add this regression for libstdc++-v3's iostreams.



More information about the Gcc-bugs mailing list