Передача вектора в функцию

0

В моем main() есть следующее:

vector<Person*> alist;
add(alist);
printDetail(alist);

Затем, в другом файле, я называю его function.cpp, в этом файле у меня есть следующие методы:

void add(vector<Person*> &mylist)
{  
    Person temp_p("firstname1","lastname1",20);

    mylist.push_back(new Person("firstname2","lastname2",20));
    mylist.push_back(&temp_p);

    printDetail(mylist);
}

void printDetail(vector<Person*> mylist)
{
    for(int i=0;i<mylist.size();i++)
    {
        mylist[i]->display();
    }
}

Когда я запускаю эту программу, то printDetail(mylist), внутри add() метода, распечатает как результат без каких - либо проблем, но в main(), только firstname2 один будет распечатана.

Может ли кто-нибудь сказать мне, почему это происходит?

Теги:

2 ответа

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

Когда вы это сделаете:

mylist.push_back(&temp_p);

вы сохраняете указатель на локальную переменную в векторе. Когда функция возвращается, объект, на который он указывает, перестает существовать, поэтому ваш вектор остается с висящим указателем. Это приводит к неопределенному поведению.

  • 0
    не могли бы вы показать мне, что я должен написать в этой строке? Я пытался передать temp_p другим способом, *, и т. Д., Но все получают ошибку.
  • 0
    @Qin, вы не можете передать адрес temp_p вектору, так как temp_p является локальным для функции. Вы должны найти другой способ сделать то, что вы пытаетесь сделать.
Показать ещё 1 комментарий
1

В основной функции пытаются ссылаться на объект, который удаляется при возврате функции add(). Другой объект работает нормально, потому что, когда вы используете "новый" оператор, вы явно выделяете память для этого объекта, и он не разрешается автоматически после завершения функции. В зависимости от того, чего вы пытаетесь достичь, вы должны выделить память для temp_p самостоятельно (используя новый оператор) или создать его как глобальный объект.

Ещё вопросы

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