Я пытаюсь понять указатели в C++, но не могу найти ответа на эти вопросы.
Если бы у меня был ArrayList в Java, и я хотел бы добавить к нему новые объекты в цикле, я бы сделал что-то вроде:
ArrayList<MyObject> list = new ArrayList<MyObject> ();
for (int i = 0; i < otherList.length; i++) {
list.add(i, new MyObject(otherList.get(i)));
}
Но допустим, я хотел сделать то же самое в C++, используя векторы. Я нашел два метода:
vector<MyObject> vector;
for (auto i = otherVector.begin(); i != otherVector.end(); i++) {
// do this
vector[i - otherVector.begin()] = * new MyObject(*i);
// or this
MyObject newObj(*i);
vector[i - otherVector.begin()] = newObj;
}
В чем разница между этими двумя методами, и если я использую второй, нужно ли мне вручную удалять указатели из списка? Если бы я использовал второй метод с интеллектуальными указателями, они были бы автоматически удалены контроллером gc, когда вектор больше не использовался?





Первый метод создает утечку памяти. Нет никакого спасения. Забудьте, что вы когда-нибудь слышали об операторе new.
if I use the second one, do I need to manually delete the pointers from the list?
В списке нет указателей.
Второй будет работать, и он уберет за собой, когда vector выйдет из области видимости. Но не делайте этого.
vector<MyObject> vector;
for (auto i = otherVector.begin(); i != otherVector.end(); i++) {
// do this
vector[i - otherVector.begin()] = * new MyObject(*i); // No, no, no, no.
// or this
MyObject newObj(*i);
vector[i - otherVector.begin()] = newObj; // Please don't.
}
Но вот один из способов сделать это. Нет петли. (И не называйте вещи «вектором».)
std::vector<my_object> vec(other_vector);
Если вы действительно любите лаконичность, сделайте следующее:
auto vec{other_vector};