C#垃圾收集->;到C++;删除 < >我将C++项目转换成C++,并在使用后有一个关于删除对象的问题。在C语言中,GC当然负责删除对象,但是C++中必须使用删除< /COD>关键字。
我的问题是,只需在整个方法中跟踪每个对象的用法,然后在其超出范围后立即将其删除(即方法结束/重新分配)是否可以 我知道GC在删除之前会等待一定大小的垃圾(~1MB);它这样做是因为使用delete时存在开销吗 由于这是我正在创建的一个游戏,可能每秒都会创建和删除大量对象,所以最好跟踪超出范围的指针,一旦指针大小达到1MB,然后删除指针C#垃圾收集->;到C++;删除 < >我将C++项目转换成C++,并在使用后有一个关于删除对象的问题。在C语言中,GC当然负责删除对象,但是C++中必须使用删除< /COD>关键字。,c#,c++,object,garbage-collection,delete-operator,C#,C++,Object,Garbage Collection,Delete Operator,我的问题是,只需在整个方法中跟踪每个对象的用法,然后在其超出范围后立即将其删除(即方法结束/重新分配)是否可以 我知道GC在删除之前会等待一定大小的垃圾(~1MB);它这样做是因为使用delete时存在开销吗 由于这是我正在创建的一个游戏,可能每秒都会创建和删除大量对象,所以最好跟踪超出范围的指针,一旦指针大小达到1MB,然后删除指针 (作为一个侧注:游戏优化后,在启动时对象将被加载一次,所以在游戏过程中没有太多的删除)你应该尽可能地在C++中使用 < /强>,这样你就不必显式地发布代码>删除<
(作为一个侧注:游戏优化后,在启动时对象将被加载一次,所以在游戏过程中没有太多的删除)
你应该尽可能地在C++中使用<强> < /强>,这样你就不必显式地发布代码>删除< /代码>任何时候。一旦您通过智能指针和您自己的资源管理类使用RAII,您所做的每个动态分配将只存在,直到有任何可能的引用为止,您不必显式地管理任何资源。在释放对象时,除了在对象超出范围时调用
delete
之外,还需要考虑很多事情。您必须确保只调用一次delete
,并且只在指向该对象的所有指针超出范围后调用它。NET中的垃圾收集器为您处理所有这些
结构,它主要对应于C++中的结构是
<>也可以,我建议你把书“有效C++”和“更有效的C++”。 < p>你的问题是你在C++中使用指针。 这是一个你必须解决的基本问题,然后你所有的问题都消失了。碰巧的是,我对我在这个问题上创造的这个大趋势感到非常厌倦(,请随意使用) 看一下幻灯片。虽然它们肯定不是完全严肃的,但最基本的信息仍然是正确的:不要使用指针。但更准确地说,信息应该是:不要使用
删除
在你的特殊情况下,你可能会发现自己有很多长寿命的小物件。这确实是一种现代GC可以很好地处理的情况,而引用计数智能指针(
shared_ptr
)处理的效率较低。如果(只有这样),这就变成了性能问题,考虑切换到一个库。 嗯,最简单的解决方法可能是使用垃圾回收。
C++。例如,Boehm收集器工作良好。尽管如此,还是有
利与弊(但移植最初用C#编写的代码将是一个挑战)
可能出现的情况是利大于弊。)
否则,如果将代码转换成惯用的C++,就不应该 许多动态分配的对象需要担心。不同于C++,C++ 默认情况下具有值语义,并且大多数短期对象 应该是简单的局部变量,如果返回可能会被复制, 但不是动态分配的。在C++中,动态分配通常是 仅用于实体对象,其生存期取决于外部事件; e、 g.
怪物
是在某个随机时间以概率创建的
取决于游戏状态,并在稍后的某个时间删除
对改变游戏状态的事件的反应。在这种情况下,你
当怪物不再是游戏的一部分时,删除该对象。在里面
C#,您可能有一个dispose
函数,或者类似的函数
这样的对象,因为它们通常有具体的动作,必须
当它们不再存在时执行,例如取消注册为
观察者,如果这是你正在使用的模式之一。在C++中
这类事情通常由析构函数处理,而不是
调用dispose,则调用delete对象。在C#中使用引用的每个实例中替换一个共享的ptr,将以可能最低的输入工作量获得最接近的近似值