gpt4 book ai didi

visual-studio-2010 - 我是否需要在 C++/CLI 中对 IDisposable 对象调用 delete

转载 作者:行者123 更新时间:2023-12-01 11:56:49 24 4
gpt4 key购买 nike

我的印象是,在 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 中(我理解行为相同是一个相对术语,因为托管对象上的删除与非托管对象上的操作不同)。

最佳答案

  1. 您永远不会严格需要在 .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
  2. 调用 deletenullptr是完全安全的,定义好的行为,就像在 C++ 中一样——不需要 if .

关于visual-studio-2010 - 我是否需要在 C++/CLI 中对 IDisposable 对象调用 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com