Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#垃圾收集->;到C++;删除 < >我将C++项目转换成C++,并在使用后有一个关于删除对象的问题。在C语言中,GC当然负责删除对象,但是C++中必须使用删除< /COD>关键字。_C#_C++_Object_Garbage Collection_Delete Operator - Fatal编程技术网

C#垃圾收集->;到C++;删除 < >我将C++项目转换成C++,并在使用后有一个关于删除对象的问题。在C语言中,GC当然负责删除对象,但是C++中必须使用删除< /COD>关键字。

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++中使用 < /强>,这样你就不必显式地发布代码>删除<

我的问题是,只需在整个方法中跟踪每个对象的用法,然后在其超出范围后立即将其删除(即方法结束/重新分配)是否可以

我知道GC在删除之前会等待一定大小的垃圾(~1MB);它这样做是因为使用delete时存在开销吗

由于这是我正在创建的一个游戏,可能每秒都会创建和删除大量对象,所以最好跟踪超出范围的指针,一旦指针大小达到1MB,然后删除指针


(作为一个侧注:游戏优化后,在启动时对象将被加载一次,所以在游戏过程中没有太多的删除)

你应该尽可能地在C++中使用<强> < /强>,这样你就不必显式地发布代码>删除< /代码>任何时候。
一旦您通过智能指针和您自己的资源管理类使用RAII,您所做的每个动态分配将只存在,直到有任何可能的引用为止,您不必显式地管理任何资源。

在释放对象时,除了在对象超出范围时调用
delete
之外,还需要考虑很多事情。您必须确保只调用一次
delete
,并且只在指向该对象的所有指针超出范围后调用它。NET中的垃圾收集器为您处理所有这些

结构,它主要对应于C++中的结构是Tr1::SyrdHypTr> /Cord>,它保持对象的引用计数器,当它下降到0时释放。一种让事物运行的第一种方法是将所有C引用引用到C++ +Cald> Tr1::SyrdYPPTR 。然后你可以进入那些性能瓶颈的地方(只有经过了一个配置文件验证它是一个实际瓶颈),然后改变到更有效的内存处理。

< P>内存管理在C++和C++中完全不同。在C++中,你不应该试图模仿.NET的GC行为。在.NET中,分配内存非常快(基本上是移动指针),而释放内存则是一项繁重的任务。在C++中,内存分配不是轻量级的,原因有几个,主要是因为必须找到足够大的内存块。当在程序执行期间多次分配和释放不同大小的内存块时,堆可能会变得支离破碎,包含许多可用内存的小“洞”。在.NET中,这不会发生,因为GC将压缩堆。但是,C++中内存的释放速度相当快。p> <> NET中的最佳实践不一定在C++中工作。例如,大多数时候不建议在.NET中共享和重用对象,因为GC会将对象提升到更高的一代。GC最适用于短期对象。另一方面,在C++中汇集对象对于避免堆碎片非常有用。此外,分配更大的内存块和使用新的位置对于许多需要频繁分配和释放的较小对象非常有用,就像在游戏中一样。读C++中的一般内存管理技术,如OR.
<>也可以,我建议你把书“有效C++”和“更有效的C++”。

< p>你的问题是你在C++中使用指针。 这是一个你必须解决的基本问题,然后你所有的问题都消失了。碰巧的是,我对我在这个问题上创造的这个大趋势感到非常厌倦(,请随意使用)

看一下幻灯片。虽然它们肯定不是完全严肃的,但最基本的信息仍然是正确的:不要使用指针。但更准确地说,信息应该是:不要使用
删除


在你的特殊情况下,你可能会发现自己有很多长寿命的小物件。这确实是一种现代GC可以很好地处理的情况,而引用计数智能指针(
shared_ptr
)处理的效率较低。如果(只有这样),这就变成了性能问题,考虑切换到一个库。

嗯,最简单的解决方法可能是使用垃圾回收。 C++。例如,Boehm收集器工作良好。尽管如此,还是有 利与弊(但移植最初用C#编写的代码将是一个挑战) 可能出现的情况是利大于弊。)

否则,如果将代码转换成惯用的C++,就不应该 许多动态分配的对象需要担心。不同于C++,C++ 默认情况下具有值语义,并且大多数短期对象 应该是简单的局部变量,如果返回可能会被复制, 但不是动态分配的。在C++中,动态分配通常是 仅用于实体对象,其生存期取决于外部事件; e、 g.

怪物
是在某个随机时间以概率创建的 取决于游戏状态,并在稍后的某个时间删除 对改变游戏状态的事件的反应。在这种情况下,你 当怪物不再是游戏的一部分时,删除该对象。在里面 C#,您可能有一个
dispose
函数,或者类似的函数 这样的对象,因为它们通常有具体的动作,必须 当它们不再存在时执行,例如取消注册为 观察者,如果这是你正在使用的模式之一。在C++中 这类事情通常由析构函数处理,而不是
调用dispose
,则调用delete对象。

在C#中使用引用的每个实例中替换一个共享的ptr,将以可能最低的输入工作量获得最接近的近似值