Odd Destructor Behavior
Matt Elkins via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Feb 7 13:49:24 PST 2016
I've been experiencing some odd behavior, where it would appear
that a struct's destructor is being called before the object's
lifetime expires. More likely I am misunderstanding something
about the lifetime rules for structs. I haven't been able to
reproduce with a particularly minimal example, so I will try to
explain with my current code:
I have a struct called "TileView", with the relevant parts
looking like so:
[code]
struct TileView
{
this(Texture.Handle wallsTexture, Texture.Handle topTexture)
{
// Work happens here, but it doesn't seem to matter to
reproducing the condition
}
// Destructor added for debugging after seeing odd behavior
~this()
{
import std.stdio;
writeln("HERE2");
}
// ...more implementation that doesn't seem to affect the
condition...
}
[/code]
An instance of this is stored in another struct called "View",
with the relevant parts looking like so:
[code]
struct View
{
this(/* irrelevant args here */)
{
writeln("HERE1a");
m_tileView =
TileView(Texture.create(loadTGA(makeInputStream!FileInputStream("resources/images/grass-topped-clay.tga").handle)), Texture.create(loadTGA(makeInputStream!FileInputStream("resources/images/grass-outlined.tga").handle)));//, Texture.create(loadTGA(makeInputStream!FileInputStream("resources/images/grass-outlined.tga").handle)));
writeln("HERE1b");
}
TileView m_tileView;
// ...more irrelevant implementation...
}
[/code]
The output from the two writelns in View and the one in TileView
is:
[output]
HERE1a
HERE2
HERE1b
[/output]
So the destructor of TileView is being called during its
construction. Flow proceeds normally (e.g., no exception is
thrown), as demonstrated by "HERE1b" being printed. Interestingly
enough, it all seems to hinge on the second argument to
TileView's constructor; if I make it on a separate line
beforehand and pass it in, or if I don't pass in a second
argument at all, I don't see this behavior. In fact, almost any
attempt I've made to reduce the problem for illustration causes
it to vanish, which is unfortunate.
From this non-reduced situation, does anything jump out? Am I
missing something about struct lifetimes? This is the only place
I instantiate a TileView.
Thanks!
More information about the Digitalmars-d-learn
mailing list