更好地理解堆堆栈和列表



有这样的代码:

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);

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

感谢

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代码

您的假设是正确的,但如果您使用Personlist,则您没有在"堆"上创建timmy

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

push_back(副本省略)中极有可能不会制作额外的人员副本。在C++11中,即使没有消除复制,移动语义也可能会起作用,并导致昂贵的复制。

最新更新