释放D语言中的资源 在C++中使用Direct3D时,我可以编写一个“立方体”类,例如包含一个“ID3D11BuffuxVeltBuffrEy”,并确保该多维数据集对象的析构函数调用VeltBuffry->RelaseE.()/

释放D语言中的资源 在C++中使用Direct3D时,我可以编写一个“立方体”类,例如包含一个“ID3D11BuffuxVeltBuffrEy”,并确保该多维数据集对象的析构函数调用VeltBuffry->RelaseE.()/,d,direct3d,direct3d11,D,Direct3d,Direct3d11,我可以有一个“场景”类,其中包含一个“唯一的”立方体对象。这样我就知道,当我删除场景时,立方体将被删除,从而调用它正在使用的D3D资源上的release 在D,我不能这样做。我可以编写析构函数,但不知道何时调用它们。如果GC不需要内存,它们可能永远不会被调用 那么,在D中处理这类事情的最佳方式是什么?我可以给每个对象添加一个“自由”成员函数,释放所有资源,并在它拥有的任何对象上调用“免费”,但这似乎是一个容易出错的手动操作,并且是从C++中向后退的一个步骤。 有没有更好的方法在D中处理这种事情?

我可以有一个“场景”类,其中包含一个“唯一的”立方体对象。这样我就知道,当我删除场景时,立方体将被删除,从而调用它正在使用的D3D资源上的release

在D,我不能这样做。我可以编写析构函数,但不知道何时调用它们。如果GC不需要内存,它们可能永远不会被调用

那么,在D中处理这类事情的最佳方式是什么?我可以给每个对象添加一个“自由”成员函数,释放所有资源,并在它拥有的任何对象上调用“免费”,但这似乎是一个容易出错的手动操作,并且是从C++中向后退的一个步骤。
有没有更好的方法在D中处理这种事情?

只是澄清一下:析构函数总是被调用的。如果在应用程序关闭时对象尚未完成,则GC将运行其终结器


< >我不知道手动调用一个For()函数来删除顶点缓冲区比在C++中手动管理内存更容易出错。无论如何,您可能需要查看:并且可以在堆栈上使用struct。这具有决定性的破坏性。您甚至可以使用重新计数。但是,如果要保证析构函数运行,请不要在堆上使用结构。目前,我认为如果将结构的析构函数放在堆上,它们就永远不会运行,因为GC没有执行此操作所需的信息(但这应该在将来某个时候修复)

但如果您坚持将其放入类的堆中,并且希望显式销毁该对象,则可以对其调用
clear

clear(obj);
这将调用对象的析构函数,然后将其置于无效状态,之后尝试使用该析构函数的任何操作都将崩溃(IIRC,虚拟表被置零)。但是内存实际上并没有被释放。这是总司令的工作。不要使用
delete
。它将被弃用。事实上,我很惊讶它还没有出现,因为它已经被计划了好几年来摆脱它

当然,一种选择是使用一个显式函数,您可以调用它来释放资源。这是不是一个好主意取决于你在做什么。但无论如何,类都是由GC收集的,而不是在您选择释放时释放

自定义分配器的工作正在进行中,这将为您提供更多如何分配类的选项,其中之一可能允许您对类进行更确定的销毁,但这还没有准备好

如果你觉得很疯狂,可以使用,它将取代即将被弃用的类型修饰符
scope
(尽管
scope
在其他上下文中仍然存在,比如
scope
语句)。它将一个类放在堆栈上。但这是不安全的(这就是为什么
scope
在本文中消失的原因),如果要将对象粘贴到堆栈上,您可能还不如使用struct

<> > >编辑:你也可以使用MalCal和 < /Cord> >将对象放在一个非GC分配的内存块中,就像C++中的一样,但是我认为你必须明确地调用析构函数来运行它,因为Fuele>代码不理解析构函数(它是C函数)。这样做的好处是使内存随资源一起消失(而在GC堆上的对象上使用
clear
只会破坏对象的内容,而不会释放内存),但我不知道这比在GC分配的对象上使用
clear
有多大的好处

但是,您可以创建一个类似于代码> < <代码> >的免费函数,它为您编写<代码> MalcC 和 ESPORE >代码>,然后具有类似于代码> Delaby/Debug >的自由函数,调用析构函数和<代码>免费> />代码,这将给出与C++相同的情况。事实上,我想知道这是否足够有用,使它成为标准库。不过,这可能是最终会出现在自定义分配器中的事情。因此,如果在不久的将来,您可以使用自定义分配器执行以下操作,我一点也不感到惊讶

auto obj = customAllocObj.create!MyObj(args);
//Do stuff...
customAllocObj.destroy(obj);

我想这会解决你的问题,因为这与C++中的基本相同,只是用库函数,而不是内置的<代码>新< /C>和<代码> Dele> <代码>。我想我会在新闻组上提出来的。我希望至少有一些人会喜欢这样的功能,而且这似乎与自定义分配器非常匹配。

问题是,在释放内存时会调用析构函数,而在将来的某个时候,GC会注意到不再引用该对象。我需要立即释放D3D对象,而不是在将来某个未定义的点。。。?“如果UnaryExpression是类对象引用,并且该类有析构函数,则会为该对象实例调用析构函数。”
delete
将从该语言中删除。不要用它。您可以使用
clear
,它将调用对象的析构函数并使对象无效,但不会释放内存。这是总司令的工作。如果您想要确定性销毁,那么就使用一个struct。如果类I“clear()”有其他类对象作为数据成员,我假定它们没有被清除,我必须在析构函数中手动编写代码?这基本上就是我想要避免的。这些都不是问题,我只是觉得我发现了一些比C++更有效的C++,或者我在D中缺少了一些成语。