D 如何在超出范围时调用析构函数?

D 如何在超出范围时调用析构函数?,d,D,在GC打开的情况下,是否可以在超出范围后立即调用析构函数 当所有的对象[任何类型]超出作用域时,是否可以调用析构函数 为什么在超出范围时不调用析构函数 在post中,“局部变量上的范围”被称为“不安全”。为什么认为它不安全? 不推荐该功能的理由是 作为类型约束的作用域在没有令人信服的用例的语言中是一个怪癖 没有令人信服的用例?就像将对象放在堆栈上一样(这个特性可以做到这一点,对吗?)并不比放在堆上快。通常,D GC从函数返回时不会调用析构函数。GC在分配发生时以及调用时被触发 D has,它将非

在GC打开的情况下,是否可以在超出范围后立即调用析构函数

所有的对象[任何类型]超出作用域时,是否可以调用析构函数

为什么在超出范围时不调用析构函数

在post中,“局部变量上的范围”被称为“不安全”。为什么认为它不安全?
不推荐该功能的理由是

作为类型约束的作用域在没有令人信服的用例的语言中是一个怪癖


没有令人信服的用例?就像将对象放在堆栈上一样(这个特性可以做到这一点,对吗?)并不比放在堆上快。

通常,D GC从函数返回时不会调用析构函数。GC在分配发生时以及调用时被触发

D has,它将非RAII类型包装在具有RAII行为的结构中。这样,结构的析构函数就可以负责清理内存。请注意,虽然这通常是可行的,但GC将自动处理一些特殊情况和需要注意的事项。这允许在离开作用域时对任何对象调用析构函数

当所有对象离开作用域时,不会对其调用析构函数,因为可能存在对这些对象的其他引用。考虑这个代码:

int* global;

void func() {
    int* p = new int;
    global = p;
}
如果在返回
func()
时,
p
指向的
int
被销毁,则
global
将指向已销毁的内存

你链接的文章已经有将近十年的历史了,同时D也发生了一些变化<代码>范围现在有了更好的语义,这意味着限制了您可以使用标记为以下内容的变量:


scope
局部变量仍可能分配给全局变量,这似乎是一种疏忽。如果找不到现有的bug,我会提交一个bug。

我知道可能有对对象的引用。但是为什么不能在最后一个引用被释放时调用析构函数呢?这是可能的,通常被称为引用计数。引用计数有一些问题是由GC处理的,就像GC有一些问题是RC做得更好一样。Bacon等人在文章中对此进行了阐述。D选择了GC,但是使用RC是有可能的(参见D中的内容。文件之类的东西呢?因为析构函数是由GC调用的,这意味着文件的句柄也是由GC关闭的?这不是很疯狂吗?