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

标签 visual-studio-2010 .net-4.0 c++-cli

我的印象是,在 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/

相关文章:

c++ - 如何以及在注册表中写入什么以在 Windows 启动时自动重启程序

c# - 如何使用来自 t4 模板的 app.config 中的自定义部分

c# - Linq-to-SQL - 采取不工作

c++ - 使用 c++/cli 中的 std::string 参数调用 native c++ dll

visual-studio-2010 - CA0001 : Member FirstOrDefault could not be found, 代码分析错误

.net - 在.Net 3.5应用程序中使用Entity Framework 4.0

c# - 如何将这段代码从 .net 4.0 降级到 3.5?

c# - C++/CLI 获取 "wrapper"类对象以显示在 C# 中

c# - 如何在 Visual Studio 中从 C++/CLI 和 C# 调用 C++/CLI?

c++ - 使用 OpenGL 使用 C++ 制作 3D 橱柜图像