Саморегистрация глобального объекта - PullRequest
1 голос
/ 26 января 2012

Я работаю над библиотекой, где пользователи должны иметь возможность использовать статические глобальные экземпляры.Эти экземпляры (запускаемые перед main) регистрируются в другом глобальном векторе, который затем может быть использован ...

В настоящее время все выглядит примерно так ...

class A;

std::vector<A*> v;

class A {
public:
    A (int i) : i(i) {
        v.push_back(this);
    }

    int get () const {
        return this->i;
    }
private:
    int i;
};

A a(1);
A b(2);

int main ()
{
    for (A* const& c : v)
        std::cout << c->get() << std::endl;

    for (std::vector<A*>::iterator i = v.begin(); i != v.end(); i++)
        delete *i;

    return 0;
}

ОднакоБоюсь, что этот код утечет ... тем более, что когда я не хочу, чтобы пользователи явно удаляли содержимое вектора (они все равно его забудут), это должно произойти автоматически в конце main.

Есть ли другие решения?Я хотел использовать вектор std :: unique_ptr, но, видимо, они так не работают ...

1 Ответ

4 голосов
/ 26 января 2012
  1. Ваш код не течет.Единственное, что выделяет память, это std::vector, и она очищается при уничтожении.
  2. a и b корректно уничтожаются и освобождаются в конце выполнения.
  3. Вы не должны delete вещи, которые не были выделены с new.

Кроме того, вы полагаетесь на то, что v инициализируется до создания a и b.Вы должны лениво инициализировать v вместо этого (см. Ниже).

std::vector<A*>& global_v()  
{  
    static std::vector<A*> v;  
    return v;  
}  

// use global_v() instead of v in the A constructor.

Чтобы получить то, что вы хотите, просто удалите цикл, который удаляет эти объекты.

Вот ваш код, работающий в действии с удаленными циклами и некоторыми отладочными выходными даннымидобавлено.Обратите внимание, что оба объекта уничтожены правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...