Работая в неуправляемом мире, мы должны убедиться, что мы убираем за собой, если мы выделили память в куче (например, используя ключевое слово new
в C ++); мы также должны убедиться, что мы AddRef
COM-компоненты, созданные с использованием CreateInstance
и Release
позже; возможно что-то вроде:
SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
obj->AddRef();
m_anotherObj= obj->GetObj();
obj->Release();
}
Очевидно, что мы могли бы использовать умные указатели и другие подобные вещи (в C ++), но это не главное ...
Нужно ли нам AddRef/Release
для объектов, которые извлекаются из компонентов COM (например, m_anotherObj в приведенном выше примере)?
Чтобы сделать вещи более запутанными, что произойдет, если этот конкретный компонент, который на самом деле является компонентом .NET, подвергается воздействию неуправляемого кода через интерфейс COM? Знает ли сборщик мусора, чтобы убрать вещи или все это нужно сделать вручную в неуправляемом мире?