对象的delete都在什么时候?
|
player7
2007-04-20
hgeSpr spr;
bool FrameFunc(){ spr.render(); } void main(){ spr= new hgeSpr; } ----------------------------------- 我在 hgeSpr类中分别写了 this(){ printf("spr create");} ~this(){printf("spr release");} 但是发现程序运行后,并没有执行 ~this() ,请问到底这个对象的销毁是在什么时候? |
|
|
player7
2007-04-20
按照我的理解,因为spr 不是在main()中定义的,所以也不在 main()中销毁,是不是在 main()外还有D的主函数?
但不是不论如何,这个~this() 到底被不被执行呢? |
|
|
qiezi
2007-04-20
GC的时候销毁的,你这个程序里应该是在退出时才销毁。如果想控制它在退出作用域时销毁,加上scope:
import std.stdio;
class Foo
{
this(){writefln("Foo");}
~this(){writefln("~Foo");}
}
Foo foo;
void main()
{
writefln("Begin");
{
scope foo = new Foo;
}
writefln("End");
}
由于new Foo操作是在一个大括号限定的作用域里面,scope限定了后面的对象在退出这个大括号时析构,所以Foo和~Foo这2个输出会在Begin和End之间。 scope其实限定的是new操作而不是前面的对象引用,这个在语法上有些误导。它正确的意思应该是这样的: foo = scope new Foo; 表明new出来的对象是scope的,而不是foo这个引用。注意上面这行不是正确的D语法。 |
|
|
player7
2007-04-20
OK,又学到一招
|
|
|
player7
2007-04-20
hgeSpr spr;
bool FrameFunc(){
spr.render();
}
void main(){
scope spr= new hgeSpr;
loopstart(); //主循环开始,反复调用 FrameFunc
}
哦,我试了一下,出现访问错误! 怀疑是在回调函数里调用 spr类引起的吧? 在回调函数里调用 spr类,算不算是出了大括号呢??? |
|
|
jinheking
2007-04-20
b不好意思,请问GC是什么意思?
qiezi 写道 GC的时候销毁的,你这个程序里应该是在退出时才销毁。如果想控制它在退出作用域时销毁,加上scope:
import std.stdio;
class Foo
{
this(){writefln("Foo");}
~this(){writefln("~Foo");}
}
Foo foo;
void main()
{
writefln("Begin");
{
scope foo = new Foo;
}
writefln("End");
}
由于new Foo操作是在一个大括号限定的作用域里面,scope限定了后面的对象在退出这个大括号时析构,所以Foo和~Foo这2个输出会在Begin和End之间。 scope其实限定的是new操作而不是前面的对象引用,这个在语法上有些误导。它正确的意思应该是这样的: foo = scope new Foo; 表明new出来的对象是scope的,而不是foo这个引用。注意上面这行不是正确的D语法。 |
|
|
tomqyp
2007-04-20
就是垃圾回收
|
|
|
player7
2007-04-20
试验了一下,果然出了大括号就算“出界”。
import std.stdio;
class Foo
{
this(){writefln("Foo");}
~this(){writefln("~Foo");}
void t1(){writefln("t1");}
}
Foo foo;
void ftest(){ foo.t1();}
void main()
{
writefln("Begin");
{
scope foo = new Foo;
// foo.t1(); // ok 输出"t1"
ftest(); // err Error: Access Violation
}
writefln("End");
}
/////////////// 输出结果: Error: Access ViolationBegin Foo ~Foo |
|
|
player7
2007-04-20
似乎有点跑题了。
“你这个程序里应该是在退出时才销毁”,问题是:不管它什么时候销毁的,它的~this()方法到底被调用了没有呢? 从现在来看,超出 main() 函数之后, printf 等函数就不起作用了,那怎么来验证呢? |
|
|
qiezi
2007-04-20
这个应该是另一个问题,scope foo = new Foo;隐含了一个auto,实际执行的是:
scope auto foo = new Foo; 这样全局变量就没有被修改,实际上你把全局变量去掉也可以编译通过。这大概是scope的陷阱。 |

