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

私が正しいことを理解していれば(私を修正してください)、ティミーはスタックに割り当てられているため、メインで使用するときにティミーの値を当てにすることはできません。私は正しいですか?このようなティミーを作成する必要がありますか:

Person* timmy = new Person(10);

スタックではなくヒープに作成するため、メソッドが戻った後に破棄されませんか?

ありがとうございました

4

2 に答える 2

2

あなたの仮定は正しいですが、代わりにof sを使用する場合、「ヒープ」に作成する必要はありません。timmylistPerson

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

push_back( copy elision )で余分な人物のコピーが作成されない可能性が非常に高くなります。C++11 では、コピーが省略されていなくても、ムーブ セマンティクスが開始され、コストのかかるコピーが発生する可能性がありました。

于 2012-07-31T11:22:25.560 に答える
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_ptrboostexception-safe

于 2012-07-31T11:02:05.970 に答える