map<string, Person*> family;
family["Bill"] = new Person();
family["Jill"] = new Person();
...
// vvv does not work vvv
for (Person* person: family)
delete person;
我試圖通過地圖做for-each循環,以免費提供給所有指針的內存。這將適用於矢量,但不適用於地圖。我怎樣才能做到這一點?
map<string, Person*> family;
family["Bill"] = new Person();
family["Jill"] = new Person();
...
// vvv does not work vvv
for (Person* person: family)
delete person;
我試圖通過地圖做for-each循環,以免費提供給所有指針的內存。這將適用於矢量,但不適用於地圖。我怎樣才能做到這一點?
for(auto const& pair : family)
{
cout << pair.first << " represented by object at " << (void*)pair.second << "\n";
}
不是使用循環刪除對象,而是直接存儲對象,而不是指向動態分配對象的指針。
這裏有一種方法刪除所有Person
對象,並刪除其映射條目:
while(not family.empty())
{
auto const it = family.begin();
delete it->first;
family.erase(it);
}
相反,如果你存儲Person
對象(不是指針動態分配的對象),這降低了
family.clear();
簡單的'delete pair.second;'會不會足夠? –
@CoffeeMaker:只要該指針以後從未被引用,甚至不會被複制。一種確保刪除該地圖條目的方法。但是在迭代遍歷所有成員的基於範圍的循環中,你無法輕鬆做到這一點。 –
@CoffeeMaker:我用更多的信息更新了答案。 –
如果您在任何搜索引擎中輸入你的標題,你會發現很多方法 –
你查看'std :: map'的'value_type'是什麼,然後使用'auto'。這就是你如何做到的。 – LogicStuff
爲什麼不讓地圖保持智能指針而不是原始指針?然後,只要清除地圖就會導致智能指針釋放其資源。 –