Должен ли я использовать вектор указателей в этом случае?

0

Мне интересно, в чем преимущество использования вектора указателей в следующем примере. Существуют ли различия между этими тремя векторами с точки зрения управления памятью? Какой из них наиболее эффективен?

class foo{
    public:
        foo(int a);
    private:
        int x;
};

foo::foo(int a){
}

int main() {
    std::vector< std::shared_ptr<foo> > vec = 
        {std::make_shared<foo>(2), std::make_shared<foo>(2)};
    std::vector<foo*> vec2 = {new foo(2), new foo(2)};
    foo o1(2), o2(2);
    std::vector<foo> vec3 = {o1, o2};
    return 0;
}
  • 1
    Почему бы не std::vector<foo> vec3 = {foo{2}, foo{2}}; ? Быть последовательным.
Теги:
vector
memory-management
dynamic-allocation

2 ответа

1
Лучший ответ

Основываясь на вашем текущем примере, я бы сказал, что std::vector<foo> - ваш лучший вариант.

std::vector< std::shared_ptr<foo> > vec = 
    {std::make_shared<foo>(2), std::make_shared<foo>(2)};

Использование shared_ptr позаботится об управлении памятью, сохранив счетчик ссылок. Когда ссылок на объект больше нет, объект будет уничтожен.


std::vector<foo*> vec2 = {new foo(2), new foo(2)};
foo o1(2), o2(2);
std::vector<foo> vec3 = {o1, o2};

Нормальные ints и указатели имеют одинаковый размер, поэтому с одним int в вашем классе foo, единственное различие заключается в возможности утечки памяти, если вы забудете удалить указатель.

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


Если вам требуются указатели, интеллектуальные указатели обычно являются лучшим вариантом из-за управления памятью.

2

В общем, я бы рассмотрел использование вектора указателей, если:

  1. Время жизни объектов (или частей объектов) в векторе больше времени жизни самого вектора

  2. Вы полагаетесь на полиморфизм и динамическую отправку. Затем у вас есть вектор указателей на базовый класс, заполняйте его указателями на производные классы и делайте что-то с помощью виртуальных функций

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

В противном случае трудно сказать, какие требования вы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню