【问题标题】:Is it possible to perform manually deleting of object in .NET?是否可以在.NET 中手动删除对象?
【发布时间】:2014-09-12 11:37:50
【问题描述】:

在 C++ 等非托管语言中,我可以使用 delete 运算符删除对象。但是 .NET 平台是托管的,所以只有垃圾收集器才能从内存中删除对象。我们只能删除对对象的所有引用,垃圾收集器会在某个时候收集它。但我想立即删除对象。

有没有办法使用 C++ 库删除对象?主要思想:

  1. 创建 C++ 库
  2. 定义使用mscoree.dll删除对象的方法DeleteUnsafe(void* pointer)
  3. 使用DllImport 属性从.NET 引用C++ 库

是否可以执行第二步?或者使用其他方式来实现我的目标?起点是什么?

是否可以在不破坏 CLR 的情况下执行?例如,GC 会尝试收集已删除的对象。我们如何从 GC 队列中移除对象?

【问题讨论】:

  • GC.Collect() 是您将获得的最接近的,但您需要一个很好的理由来干扰内置的垃圾收集机制。您想这样做的原因是什么?
  • “我想立即删除对象”。你确定你需要吗?为什么?
  • 啊。破解 CLR。我会退后的。不过似乎有些牵强。
  • 那么,您是否下载了 .NET 源代码来研究对象的实际管理方式?这就是我的建议。当您真正找到可能的黑客入口点时,请返回此处提供代码。
  • 一切皆有可能。没有什么是实用的。以前非常聪明的人和it sucked rocks 已经做过。 .NET GC 在那之后得到了更多的尊重。

标签: c# c++ .net garbage-collection clr


【解决方案1】:

不太清楚你为什么要这样做,但我假设你有一个理由。

我想到的是强制垃圾回收,但这里引用 MS 的一段话:

"可以通过调用 Collect 来强制进行垃圾回收,但是 大多数情况下,应该避免这种情况,因为它可能会产生 性能问题。 "

(您可以在这里查看更多信息:https://stackoverflow.com/a/233647/1698987

除此之外,如果你真的需要那种精细的控制,也许 c# 不是答案?

嗯...看看this msdn page。似乎打电话GC.Collect method 假设你知道你在做什么毕竟不是那么糟糕...... :)

【讨论】:

  • 假设我想写一个替代的垃圾收集器
猜你喜欢
  • 2020-04-10
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2017-08-09
  • 2012-09-22
相关资源
最近更新 更多