我對 C 比較陌生。我試圖解決這個問題。
所有代碼也在這里: https ://onlinegdb.com/wAmLAONkF (可以執行)
基本上,我有一個創建臨時物件的函式。物件被推送到std::vector:
vector<Student> GetStudents(int some_params)
{
vector<Student> students;
//logic where students are returned
Student s1 { "John", 42 };
Student s2 { "Bill", 12 };
students.push_back(s1);
students.push_back(s2);
return students;
}
為了維護物件,它們存盤在外部的std::map.
每個按指標map存盤在 a 中(它必須是!):Studentvector<Student*>vector<Student*>
map<int, vector<Student*>> m {};
{ //start of new context, other class context in another file, map is passed by reference
int some_params = 5;
vector<Student> students = GetStudents(some_params);
要將它們存盤在地圖中,我將參考復制到一個新的vector:
vector<Student*> tmpV;
for(auto & student : students)
tmpV.push_back( &student);
//store them in the map
m.emplace(some_params, tmpV);
}//leave context
//data loss - Students are lost
我知道,問題是因為指向物件的指標存盤在本地向量中。在我離開背景關系后,指標沒有指向有效的地方。
但是我該如何解決呢?
uj5u.com熱心網友回復:
vector<Student>回傳的 by需要GetStudents()存盤在與std::map參考其Students 的 the 相同范圍內(或更高范圍內)的變數中,例如:
map<int, vector<Student*>> m;
vector<Student> students; // <-- move it up here!
{ //start of new context
int some_params = 5;
students = GetStudents(some_params);
vector<Student*> tmpV;
for(auto & student : students)
tmpV.push_back( &student);
//store them in the map
m.emplace(some_params, tmpV);
} //leave context
// no data loss - Students are valid!
否則,GetStudents()將不得不回傳 a vector<Student*>,其中每個Student都是通過動態創建的new,然后在使用它們完成delete后通過銷毀:map
vector<Student*> GetStudents(int some_params)
{
vector<Student*> students;
//logic where students are returned
students.push_back(new Student{ "John", 42 });
students.push_back(new Student{ "Bill", 12 });
return students;
}
...
map<int, vector<Student*>> m;
{ //start of new context
int some_params = 5;
vector<Student*> students = GetStudents(some_params);
//store them in the map
m.emplace(some_params, students);
} //leave context
// no data loss - Students are valid!
...
for(auto &entry : m) {
for (auto *student : entry.second) {
delete student;
}
}
理想情況下,您map應該存盤vector<Student>or vector<unique_ptr<Student>>,但您對“它必須是vector<Student*>! ”的要求阻止了這種情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480149.html
上一篇:對自身的鏈表迭代沒有按預期作業
