std :: vector Уничтожение и неожиданная утечка памяти pt 2 - PullRequest
0 голосов
/ 10 июля 2011

Несколько часов назад я задал этот вопрос .Я узнал, что std :: vector удаляет каждый из своих элементов при вызове деструктора.Рассмотрим эту программу (производную от предыдущего примера): деструктор

#include <vector>
#include <iostream>

class Bar {
    int x;
public:
    ~Bar() {
        std::cout << "~bar()" << std::endl;
    }
};

class Foo {
    std::vector<Bar*> v;
public:
    Foo() {
        this->v.push_back(new Bar());
        this->v.push_back(new Bar());
        this->v.push_back(new Bar());
    }

    ~Foo() {
    }
};

int main() {
    Foo f;

    Bar* b = new Bar();

    // Bar::~Bar() called once
    delete b;

    // Bar::~Bar() not called three times as expected

    return 0;
}

b называется ожидаемым;однако деструкторы элементов Bar * в fv не называются.Согласно this , должен быть вызван деструктор каждого элемента fv.Что мне здесь не хватает?

Ответы [ 3 ]

3 голосов
/ 10 июля 2011

Как я объяснил в моем предыдущем ответе , уничтожение указателя (Bar *) не разрушает объект (Bar). Вектор уничтожает указатель Bar * три раза, но это не работает, Bar, на которые указывают, остаются одни, и поэтому вы не видите ничего напечатанного. Если бы вы использовали std::vector<Bar>, Bar s были бы уничтожены, и вы бы увидели деструктор трижды.

2 голосов
/ 10 июля 2011

Ответ на этот вопрос точно такой же, как ответ на последний вопрос.Удаление указателя не вызывает delete для него, поэтому объект, на который он указывает, не уничтожается автоматически.

Другими словами, Bar имеет деструктор, а Bar* - нет.Так что std::vector<Bar> будет вызывать деструктор каждого элемента.

0 голосов
/ 10 июля 2011

В этом случае вы удаляете только b, а также потому, что вы не уничтожаете Foo (а деструктор ничего не делает), он не удаляется.Когда программа заканчивается, она просто избавляется от всего (ей не нужно вызывать никаких деструкторов).

...