我的印象是,在 C++/CLI 方法中,如果我使用的类实现了 IDisposable,则当对象超出范围时会自动神奇地调用处置。最近我遇到了一些看起来像这样的代码:
void SomeClass::SomeMethod()
{
DisposableObject^ myObject = nullptr;
try
{
// Some code that creates a DisposableObject and assigns to myObject
}
finally
{
if (myObject != nullptr)
{
// this is instead of IDisposable.Dispose
delete myObject;
}
}
}
我的问题实际上有两个方面。首先,我是否需要在对象上显式调用 delete
。其次,在纯 C++ 中,在空对象上调用 delete 是安全的,在 C++/CLI 中这种行为是否发生变化,只是想知道,因为如果行为是 same
,我似乎并不真的需要 nullptr 检查 delete 调用在 C++/CLI 中(我理解行为相同是一个相对术语,因为托管对象上的删除与非托管对象上的操作不同)。
最佳答案
您永远不会严格需要在 .NET 中处理任何内容(除非该类实现不正确,例如,在必要时缺少终结器),但您绝对应该尽可能这样做。使用堆栈语义避免了调用
delete
的需要不需要惰性初始化时直接:void SomeClass::SomeMethod() { DisposableObject myObject; // ... // Some code that uses myObject } // myObject is disposed automatically upon going out of scope
使用
msclr::auto_handle<>
结合堆栈语义消除了对try..finally
的需要当需要惰性初始化时:void SomeClass::SomeMethod() { msclr::auto_handle<DisposableObject> myObject; // ... // Some code that creates a DisposableObject and assigns to myObject // ... // Some code that uses myObject } // myObject is disposed automatically upon going out of scope
调用
delete
值nullptr
是完全安全的,定义好的行为,就像在 C++ 中一样——不需要if
.
关于visual-studio-2010 - 我是否需要在 C++/CLI 中对 IDisposable 对象调用 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375618/