即使它应该,c ++ map也不会返回end()

时间:2012-02-28 21:09:26

标签: c++ memory-leaks map segmentation-fault

在我的代码中,我有一张地图(tBoxes),vector<int>开始关键,set< pair<int,int> >是值。

出于某种原因,当我尝试访问地图的特定元素时,程序会因分段错误而崩溃。如果我通过valgrind运行程序一切都很好(这就是我知道元素是空的)。此外,valgrind没有说明任何内存泄漏。我正在使用的循环是一个天真的循环:

map<vector<int>,set<int, int> > tBoxes;


/*populate boxes*/

vector<int> t(3,0);
set<pair<int, int> >::iterator it;

for(int i = mini; i <= maxi; i++){
  t[0] = i;
  for (int j = minj; j <= maxj; j++){
    t[1] = j;
    for (int k = mink; k <= maxk; k++){
      t[2] = k;
      it = tBoxes[t].begin();
      while (it != tBoxes[t].end()){
        it++;
      }
    }
  }
}

编辑:

由于我使用了奇怪的变量名,因此代码不是我文件中的直接副本。 我怀疑这是地图内存分配的问题,但我不知道如何解决这个问题。此外,该值为set而非vector

2 个答案:

答案 0 :(得分:2)

for (int k = mink; k <= maxj; k++){ // should'n it be maxk?

旧的“复制粘贴”错误:D

编辑:Op更改了代码并更正了我指出的内容,因此这个答案不再有效......

答案 1 :(得分:0)

编辑: 完全重写以将int插入到一组int中,然后将这些int插入到int组向量的向量映射中。 (Sic。)然后检索原始的int。

int main( int argc, char *argv )
{
    map< vector<int>, set<int> > tBoxes;

    vector<int> vecInsert( 3, 0 );
    set<int> setInsert;
    setInsert.insert( 666 );

    tBoxes.insert( std::make_pair( vecInsert, setInsert ) );

    ///////////////////////////////////////////////////////////

    vector<int> vecLookup( 3, 0 ); //identical to vecInsert
    set<int> setLookup =  tBoxes[vecLookup]; //the set mapped by the 'key' vector above
    set<int>::iterator iter = setLookup.begin(); //the first element in the set

    if( iter != setLookup.end() )
    {
        int i = *iter;
        if( i == 666 )
        {
            //eureka!!
        }
    }

    return 0;

}