This is the mail archive of the
mailing list for the GCC project.
RE: Attribute destructor function and C++ destructors
- From: "Simon White" <s_a_white at email dot com>
- To: "John \\\\(Eljay\\\\) Love-Jensen" <eljay at adobe dot com>, gcc-help at gcc dot gnu dot org
- Date: Fri, 17 Nov 2006 09:13:12 -0500
- Subject: RE: Attribute destructor function and C++ destructors
Thankyou for the reply.
> My first recommendation is, if possible, never ever ever ever ever
> ever ever rely on "stuff that happens before main()", and "stuff
> that happens after main()". Put explicit initialization in main
> using RAII. Life will be better.
I'm not sure what RAII is, will have to look it up. However the
initialisation/finalisation I wanted to happen automatically on
shared library load/removal.
> Are the globals in the same translation unit (i.e., static
> globals)? If they are, they are slightly better behaved than if
> the statics are being used across translation units.
They are static and in the same execution scope. They are also not
passed as pointers outside that scope. Ignoring specific syntax
the code in question basically amounts to:
static std:string test;
foo_init () << attribute constructor
test = "hello";
foo_fini () << attribute destructor
printf ("%s\n", test.c_str()); <<< invalid on 4.1.1
> If the static globals are in the same translation unit, where you
> place them in the translation unit determines their OoC and LIFO
> OoD. If they do not have external linkage (extern globals), then
> you can rely on their OoC.
Ok. Normally I'm used to the listed first, created first/destructed last
approach, which I believe should make the above correct. How would
you change order correctly between C++ destructors and an attribute
> If you are still running into problems, consider using the Nifty
> Counter pattern (aka Schwarz counter), which is what the I/O
> Streams use:
I'll take a look, thankyou.
Search for products and services at: