Why is a static struct's dtor called at the exit of a function?
Steven Schveighoffer
schveiguy at yahoo.com
Thu Jul 21 08:52:58 PDT 2011
On Wed, 20 Jul 2011 15:57:44 -0400, Jonathan M Davis <jmdavisProg at gmx.com>
wrote:
> On Wednesday 20 July 2011 21:54:19 Andrej Mitrovic wrote:
>> import std.stdio;
>>
>> void main()
>> {
>> writeln("test");
>> test();
>> writeln();
>> writeln("test");
>> test();
>> }
>>
>> struct Foo
>> {
>> int state;
>> this (int i)
>> {
>> state = i;
>> }
>>
>> ~this()
>> {
>> writeln("dtor");
>> }
>> }
>>
>> void test()
>> {
>> static Foo foo = Foo(1);
>> writeln(foo.state);
>> }
>>
>> Prints:
>> test
>> 1
>> dtor
>>
>> test
>> 1
>> dtor
>>
>> Shouldn't static variables be left untouched? I tried to use a struct
>> to handle an external device context, however the dtor would be kept
>> called between function calls, so this caused crashes for me.
>>
>> Using a class instead fixes my issue of course.
>>
>> I thought "static" for variables implied it has lifetime until the end
>> of the application, regardless of whether the memory for the variable
>> was allocated on the heap or is in the .data segment or somewhere
>> else.
>
> static variables are supposed to have essentially the same lifetime as
> the
> program. So, it definitely looks like a bug.
slight correction -- static variables are thread local (must be marked
shared to be shared between threads), so the destructor should be called
on Thread destruction.
However, I don't think that any destructors are called on thread
destruction...
But yes, they should *definitely* not be called on function exit. This is
a bug.
-Steve
More information about the Digitalmars-d-learn
mailing list