for循环中带指针的分段错误

时间:2014-02-27 00:34:22

标签: c++

代码编译正常并且运行正常,直到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;
}

1 个答案:

答案 0 :(得分:1)

让我让你的代码充满指针和动态分配,并将其转换为错误和内存泄漏免费版本:

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类供你使用。