对象的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的陷阱。

相关讨论