2015-05-09 3 views
0

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

void addPerson(list<person> &list) 
{ 
    person p("Michael", 19); 
    list.push_back(p); 
} 

int main 
{ 
    list<person> list; 
    addPerson(list); 
    cout<<list.size(); 
} 

Я знаю, что размер в списке является будет 1, но я чувствую, как сфера P, только в addPerson(), как только метод завершится, p будет уничтожен, и память, которая будет удерживаться p, будет выпущена, что означает, что список в main потеряет этот элемент?

+2

Предполагая, что вы используете 'зЬй :: list', значение' p' будет * копироваться * в список при вызове 'push_back'. . Объект person в списке - это копия 'p', а не' p'. – PaulMcKenzie

+0

@PaulMcKenzie, но прототип функции void push_back (const value_type & val), не используется ли ссылка, а не копия? – lxdthriller

+0

Вы передаете значение по ссылке. Ничто не останавливает функцию 'push_back' от копирования этого значения. Если вы хотите доказать: 'void foo (int & val) {int myVal = val;}' Видите это? Значение копируется в myVal. – PaulMcKenzie

ответ

1

Позволяет пройти через вашу addPerson функцию по одному.

void addPerson(list<person> &list) 
{ 
    person p("Michael", 19); // creates a person object on the stack 
    list.push_back(p); // makes a copy of p and stores that; this copy will be on the heap 

    // provided, you have a comparison operator 
    if (p == list.back()) // you have two identical instances now 
    std::cout << "same person content\n"; 

    if (&p != &list.back()) // look at the address in memory 
    std::cout << "persons are not identical\n"; 
} // p goes out of scope and is destroyed, the copy in list lives on 

В случае запуска оба отчета cout будут напечатаны. Для полноты, также давайте посмотрим на основные функции:

int main 
{ 
    list<person> list; 
    addPerson(list); // call by reference, the function acts very same instance of the first line 
    cout<<list.size(); 
}