Мне интересно, в чем преимущество использования вектора указателей в следующем примере. Существуют ли различия между этими тремя векторами с точки зрения управления памятью? Какой из них наиболее эффективен?
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;
}
Основываясь на вашем текущем примере, я бы сказал, что 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 и пытается его использовать.
Если вам требуются указатели, интеллектуальные указатели обычно являются лучшим вариантом из-за управления памятью.
В общем, я бы рассмотрел использование вектора указателей, если:
Время жизни объектов (или частей объектов) в векторе больше времени жизни самого вектора
Вы полагаетесь на полиморфизм и динамическую отправку. Затем у вас есть вектор указателей на базовый класс, заполняйте его указателями на производные классы и делайте что-то с помощью виртуальных функций
У общего указателя есть счетчик ссылок, поэтому он немного больше, но немного безопаснее. Обычный указатель в порядке, как только вы наверняка будете уничтожать объекты надлежащим образом и своевременно
В противном случае трудно сказать, какие требования вы
std::vector<foo> vec3 = {foo{2}, foo{2}};
? Быть последовательным.