В моем 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
один будет распечатана.
Может ли кто-нибудь сказать мне, почему это происходит?
Когда вы это сделаете:
mylist.push_back(&temp_p);
вы сохраняете указатель на локальную переменную в векторе. Когда функция возвращается, объект, на который он указывает, перестает существовать, поэтому ваш вектор остается с висящим указателем. Это приводит к неопределенному поведению.
В основной функции пытаются ссылаться на объект, который удаляется при возврате функции add(). Другой объект работает нормально, потому что, когда вы используете "новый" оператор, вы явно выделяете память для этого объекта, и он не разрешается автоматически после завершения функции. В зависимости от того, чего вы пытаетесь достичь, вы должны выделить память для temp_p самостоятельно (используя новый оператор) или создать его как глобальный объект.
temp_p
вектору, так какtemp_p
является локальным для функции. Вы должны найти другой способ сделать то, что вы пытаетесь сделать.