- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的终结器问题似乎在我正在研究的C ++ / CLI(和C#)项目的早期。这似乎是一个非常复杂的问题,我将在代码中提及很多不同的类和类型。幸运的是,它是开源的,您可以在此处进行以下操作:Pstsdk.Net(Mercurial存储库)我还尝试了在适当的地方直接链接到文件浏览器,以便您在阅读时可以查看代码。我们处理的大多数代码都在存储库的pstsdk.mcpp
文件夹中。
现在的代码处于相当可怕的状态(我正在努力处理),而我正在处理的代码的当前版本在Finalization fixes (UNSTABLE!)
分支中。该分支中有两个变更集,并且要理解我的难题,我们需要同时处理这两个问题。 (更改集:ee6a002df36f和a12e9f5ea9fe)
在某些背景下,该项目是用C ++编写的unmanaged library的C ++ / CLI包装。我不是项目的协调员,我有一些不同的设计决策,因为我敢肯定,许多关注代码的人都会做,但我离题。我们将原始库的许多层包装在C ++ / CLI dll中,但在C#dll中公开了易于使用的API。这样做是因为项目的目的是将整个库转换为托管C#代码。
如果能够编译代码,则可以使用this test code重现该问题。
问题
最新的变更集名为moved resource management code to finalizers, to show bug
,显示了我遇到的原始问题。这段代码中的每个类都使用相同的模式来释放非托管资源。这是一个示例(C ++ / CLI):
DBContext::~DBContext()
{
this->!DBContext();
GC::SuppressFinalize(this);
}
DBContext::!DBContext()
{
if(_pst.get() != nullptr)
_pst.reset(); // _pst is a clr_scoped_ptr (managed type)
// that wraps a shared_ptr<T>.
}
using
语句中时,资源将立即正确释放。其次,如果用户忘记了处置,则当GC最终决定完成该类时,将释放非托管资源。
NodeIdCollection
类中。如果您能够运行上面链接的代码(由于boost库的依赖性,可能很难设置此项目),则应用程序将失败,因为
_nodes
列表设置为null,并且由于终结器运行,
_db_
指针被重置。
NodeIdCollection
类中的枚举代码是否存在任何明显问题,这些问题会导致GC在仍在使用该类时对其进行终结处理?
!classname
)移到析构函数(
~classname
)来解决此问题。这解决了问题,尽管还没有解决我对为什么提早完成课程的好奇心。
foreach (var msg in pst.Messages)
{
// If this using statement were removed, we would have
// memory leaks
using (msg)
{
// code here
}
}
clr_scoped_ptr
包装器(来自
clr_scoped_ptr.h stackexchange问题的
this)。还是我需要将本机指针包装在
scoped_ptr<T>
或
smart_ptr<T>
之类的东西中?
最佳答案
clr_scoped_ptr
是我的,来自here。
如果有任何错误,请通知我。
即使我的代码不是很完美,使用智能指针也是解决此问题的正确方法,即使在托管代码中也是如此。
您不需要(也不应该)在终结器中重置clr_scoped_ptr
。每个clr_scoped_ptr
本身都会在运行时完成。
使用智能指针时,您无需编写自己的析构函数或终结器。编译器生成的析构函数将自动在所有子对象上调用析构函数,并且每个子对象终结器在收集时都将运行。
仔细查看您的代码,NodeIdCollection
中确实存在错误。每次调用GetEnumerator()
都必须返回一个不同的枚举器对象,以便每个枚举都将从序列的开头开始。您正在重用单个枚举器,这意味着在连续调用GetEnumerator()
之间共享该位置。那很糟。
关于c# - C++/CLI库中的早期完成和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758879/
我正在为从 API 级别 8 到 14 的 android 开发一个应用程序。我正在尝试在早期版本中获得与 android 4(请参阅联系人应用程序)相同的快速滚动行为(右侧固定的时尚滚动条)边)。有
早期(编译期)优化 jvm的编译器可以分为三个编译器: 前端编译器:把*.java转变为*.class的过程。如sun的javac、eclipse jdt中的增量式编译器(ecj)
苹果终于推出了所谓的auto-renewable subscriptions昨天。由于我在应用内购买方面的经验很少(仅限沙盒),所以我不确定我在这里是否一切顺利。似乎需要对收据进行服务器端验证。找出订
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 要求代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期结果。另
在 Wagner 的“Effective C#”第 23 项中,他解释说 interface methods are not virtual...they are a declaration of a
我最近遵循了本指南 Installing a Git Server using Apache (WebDAV) on Ubuntu Server 12.04使用 Apache (WebDAV) 设置本
这是我之前的问题 jQuery UI hiding not taking effect for early DOM elements 的后续问题。我几乎刚刚编辑了那个,但不想使 the accepte
我正在尝试替换 ZonedDateTime.toInstant方法,因为它仅从 API 26 for Android 开始可用。 但我的应用程序应该支持 API 19。 我想将 ZonedDateTi
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我是一名优秀的程序员,十分优秀!