当我在VS2008中构建以下C++/CLI代码时,会显示代码分析警告CA1001。
ref class A
{
public:
A() { m_hwnd = new HWND; }
~A() { this->!A(); }
protected:
!A() { delete m_hwnd; }
HWND* m_hwnd;
};
ref class B
{
public:
B() { m_a = gcnew A(); }
protected:
A^ m_a;
};
警告:CA1001 : Microsoft.Design : 在类'B'上实现IDisposable,因为它创建了以下IDisposable类型的成员:'A'。
要解决此警告,我需要在B类中添加以下代码:
~B() { delete m_a; }
但我不理解为什么。Class A通过其析构函数(和终结器)实现IDisposable。
因此,每当A被垃圾回收时,A的终结器或析构函数将被调用,释放其非托管资源。
为什么B必须添加一个析构函数来调用其A成员上的“delete”?
如果B没有显式调用“delete m_a”,那么GC只会调用A的析构函数吗?
编辑:如果您使用声明A成员的“语法糖”方法,如下所示,则似乎会自动工作:
ref class B
{
public:
B() { }
protected:
A m_a;
};
但这并非总是可行。
为什么垃圾回收器不能聪明地自动处理A^的托管引用指针,一旦没有其他人指向它?