有这样的代码:
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_ptr
、std::unique_ptr
或boost
智能指针。它将简化内存管理和编写exception-safe
代码
您的假设是正确的,但如果您使用Person
的list
,则您没有在"堆"上创建timmy
:
void set(list<Person>& listP){
listP.push_back(Person(10));
}
。在C++11中,即使没有消除复制,移动语义也可能会起作用,并导致昂贵的复制。push_back
(副本省略)中极有可能不会制作额外的人员副本