答案 0 :(得分:2)
clr_scoped_ptr
是我的,来自here。
如果有任何错误,请告诉我。
即使我的代码不完美,使用智能指针也是处理此问题的正确方法,即使在托管代码中也是如此。
您不需要(也不应该)重置终结器中的clr_scoped_ptr
。每个clr_scoped_ptr
本身都将由运行时确定。
使用智能指针时,您不需要编写自己的析构函数或终结器。编译器生成的析构函数将自动调用所有子对象上的析构函数,并且每个子对象终结器将在收集时运行。
仔细查看代码,NodeIdCollection
确实存在错误。 GetEnumerator()
每次调用时都必须返回一个不同的枚举器对象,以便每个枚举都从序列的开头开始。您正在重复使用单个枚举器,这意味着在GetEnumerator()
的连续调用之间共享位置。那很糟糕。
答案 1 :(得分:-1)
从一些Microsoft documentation中刷新我对destructors / finalalisers的记忆,我认为你至少可以简化你的代码。
这是我的序列版本:
DBContext::~DBContext()
{
this->!DBContext();
}
DBContext::!DBContext()
{
delete _pst;
_pst = NULL;
}
“GC :: SupressFinalize”由C ++ / CLI自动完成,因此不需要。由于_pst变量在构造函数中初始化(并且删除空变量无论如何都不会引起任何问题),因此我看不出有任何理由使用智能指针使代码复杂化。
在调试说明中,我想知道是否可以通过向“GC :: Collect”调用一些来帮助解决问题。这应该迫使你为悬挂物体敲定最终结果。
希望这有点帮助,