C#垃圾收集 - >到C++删除

Lyn*_*Dev 5 c# c++ garbage-collection object delete-operator

我正在将一个C#项目转换为C++,并且有一个关于在使用后删除对象的问题.在C#中,GC当然会处理删除对象,但在C++中,它必须使用delete关键字显式完成.

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

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

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

(作为旁注:稍后当游戏优化时,对象将在启动时加载一次,因此在游戏过程中没有太多要删除的内容)

Kon*_*lph 9

您的问题是您在C++中使用指针.

这是您必须解决的根本问题,然后您的所有问题都会消失.有机会,我对这个大趋势感到厌倦,我在这个问题上创建了一套演示幻灯片.- (CC BY,所以随意使用它们).

看看幻灯片.虽然它们肯定不完全严重,但基本信息仍然是正确的:不要使用指针.但更确切地说,消息应该是:不要使用delete.

在您的特定情况下,您可能会发现自己拥有许多长寿命的小物件.这确实是现代GC处理得非常好的情况,以及哪些引用计数智能指针(shared_ptr)处理效率较低.如果(并且仅当!)这成为性能问题,请考虑切换到小型对象分配器库.

  • @James你会惊讶地发现,没有指针你会走多远.我近年来一直使用原始指针一次,在一个库中,由于一些好的和一些不好的原因不允许智能指针,甚至只在一个地方(所有其余的根本没有使用指针). - 而且我编写了性能关键且代码水平相当低的代码. (3认同)

Alo*_*ave 5

您应该在C++中尽可能多地使用RAII,这样您就不必在delete任何时候明确地使用任何东西.
一旦您通过智能指针和您自己的资源管理类使用RAII,您所做的每个动态分配将只存在,直到有任何可能的引用,您不必显式管理任何资源.

  • @Eric实施细节.您通常也不关心操作系统是否为您管理内存页面,是吗?课堂上发生的事情留在课堂上. (4认同)