[英]segmentation fault with pointer in for loop
該代碼可以正常編譯,並且可以正常運行,直到for循環迭代f_read_Prediction_Set。 細分錯誤直接在該行之后發生...我想念什么?
std::map< RAddr, uint32_t >* transCoherence::getCurrentSets(uint32_t log2AddrLs, uint32_t maskSets, uint32_t log2Assoc, int pid, RAddr caddr)//function to return prediction set
{
uint32_t set;
std::map< RAddr, uint32_t >* currentSets = new std::map< RAddr, uint32_t >;
std::map< RAddr, uint32_t >* f_read_Prediction_Set = new std::map< RAddr, uint32_t >;
for(std::map<RAddr, uint32_t>::iterator it = f_read_Prediction_Set->begin(); it!=f_read_Prediction_Set->end(); ++it)
{
set = (((it->first) >> log2AddrLs) & maskSets) << log2Assoc;
if(set == caddr)
(*currentSets)[set] = 1;
}
return currentSets;
}
讓我將您的代碼充滿指針並動態分配,並將其轉換為無錯誤且無內存泄漏的版本:
std::map<RAddr, uint32_t> transCoherence::getCurrentSets(uint32_t log2AddrLs, uint32_t maskSets, uint32_t log2Assoc, int pid, RAddr caddr)
{
std::map<RAddr, uint32_t> currentSets;
std::map<RAddr, uint32_t> f_read_Prediction_Set;
// populate f_read_Prediction_Set
for (const auto& p : f_read_Prediction_Set) {
uint32_t set = (((p.first >> log2AddrLs) & maskSets) << log2Assoc);
if(set == caddr)
currentSets[set] = 1;
}
return currentSets;
}
這樣您就可以完全忽略指針問題。
如果您擔心性能 ,則應注意,C ++中有一個稱為RVO(返回值優化)的小東西,可以避免在函數返回時實際將向量復制回去。
同樣,我也不會注意到您在地圖對象的名稱中使用了“ set”一詞,因此,如果需要唯一鍵,可以使用std :: set類對您很有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.