3

有这个代码:

void set(list<Person*>* listP){
    Person timmy = Person(10);
    listP->push_back(&timmy);
}
int main()
{
    list<Person*> listP;
    set(&listP);
    Person* timmy  = listP.back();
}

如果我理解正确(请纠正我) timmy 是在堆栈上分配的,所以当我在 main 中使用它们时,我不能指望 timmy 的值。我对么?我需要像这样创建 timmy:

Person* timmy = new Person(10);

为了在堆上而不是在堆栈上创建它,所以它不会在方法返回后被销毁?

谢谢

4

2 回答 2

2
void set(list<Person*>* listP){
    Person timmy = Person(10); // create timmy on automatic storage (stack)
    listP->push_back(&timmy); //push timmy's address
} //timmy is destroyed. pushed address points to deallocated memory

是的,您需要使用Person* timmy = new Person(10);在堆上分配。

void set(list<Person*>* listP){
    Person *timmy = new Person(10); // timmy is a pointer now
    listP->push_back(timmy); //push timmy's copy (copy of pointer)
} //timmy (pointer) is destroyed, but not the memory it points to

也更喜欢使用smart_pointers诸如std::shared_ptrstd::unique_ptrboost智能指针。它将简化内存管理和编写exception-safe代码

于 2012-07-31T11:02:05.970 回答
2

您的假设是正确的,但是如果您使用 a of s 代替,则不必timmy在“堆”上创建:listPerson

void set(list<Person>& listP){
    listP.push_back(Person(10));
}

极有可能不会在push_back复制省略中制作额外的人副本。在 C++11 中,即使没有省略复制,移动语义也可能会发挥作用,并且复制成本很高。

于 2012-07-31T11:22:25.560 回答