2015-06-21 2 views
1

Я новичок в C++ в VS C++. Я создаю библиотеку dll win32. У меня есть основная основная проблема с попыткой окончательного блока.попробуйте наконец, как освободить память

Давайте представим, что у меня есть что-то вроде этого:

class object { 
    private: 
    int* foo; 
    public: 
    object() : foo(new int()) { *foo = 42; } 
    ~object() { 
     // Now since foo is dynamically allocated, the destructor 
     // needs to deallocate it 
     delete foo; 
    } 
}; 

int main() { 
    vector<object*> tmp; 
    tmp.push_back(new object()); 

    // Do some stuff with tmp 

    for (int i = 0; i < tmp.size(); ++i) { 
    delete tmp[i]; // Calls ~object (which deallocates tmp[i]->foo) 
        // and deallocates *tmp[i] 
    } 
    tmp.clear(); 

    return 0; 
} 

Я скопировали фрагмент кода из: Another stackoverflow question

В приведенном выше примере, как можно использовать «свободный» часть, так что может быть всегда освобожден, поскольку метод завершает работу? Я думал, что попробовать наконец должно хватить.

Но теперь я вижу, что есть несколько: try, __try Не знаю, в чем разница. С __try я получаю ошибки компилятора, которые говорят что-то о RAII ...

Может ли кто-нибудь помочь мне с этим?

ответ

5

Это Resource Acquisition Is Initialization, RAII для краткости. Идея заключается в том, что если объект владеет ресурсом, его деструктор должен автоматически освобождать его. Во всех этих случаях с C++ 11 вы должны использовать std::unique_ptr вместо необработанных указателей. Так, например:

class object { 
    std::unique_ptr<int> foo; 

public: 
    object() : foo(std::make_unique<int>(42)) { } 
    // no destructor necessary here 
}; 

int main() { 
    std::vector<std::unique_ptr<object>> tmp; 
    tmp.push_back(std::make_unique<object>()); 

    // when tmp goes out of scope, each object in it will already 
    // be deleted for you, no code necessary 
} 

Среди многих преимуществ здесь является тот факт, что теперь вам не придется беспокоиться о написании конструктор копирования для object (как есть, ваш foo получит delete d дважды если вы скопируйте его). См. Также Rule of Zero

+0

Не могли бы вы переписать вышеуказанный код? – John

+2

@ Джон Чтобы сделать ... что? – Barry

+0

Извините :) Глупо меня .... :) – John

1

Существуют различные способы.

Первый - это vector<object *> a vector<unique_pointer<object> >. Не требуется явно освобождать объекты вообще.

Другим является помещение vector<object *> членом другого класса, который управляет освобождением. Итак, когда экземпляр этого класса разрушен, его деструктор освобождает все элементы вектора в вашем коде. Вам нужно будет предоставить другие конструкторы и функции-члены для этого класса, чтобы правильно управлять добавлением объектов в вектор.

Смежные вопросы