Нужно ли вызывать delete для объекта IDisposable в C ++ / CLI (VS 2010 / .Net 4.0) - PullRequest
3 голосов
/ 16 июня 2011

У меня сложилось впечатление, что в методе C ++ / CLI, если класс, который я использовал, реализует IDisposable, dispose автоматически вызывается, когда объект выходит из области видимости. Недавно я наткнулся на код, который выглядит так:

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, просто интересно, потому что кажется, что мне не нужна проверка nullptr вокруг вызова delete, если поведение является same в C ++ / CLI (я понимаю, что поведение - это относительный термин, поскольку удаление на управляемом объекте делает разные вещи, чем на неуправляемом объекте).

1 Ответ

5 голосов
/ 16 июня 2011
  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. Вызов delete для значения nullptr является полностью безопасным, определенным поведением, как в C ++- нет необходимости в if.

...