ошибка двойного освобождения или повреждения в системе Unix

0

Я получаю это сообщение после запуска моей программы в системе Unix:

*** glibc detected *** ./anal: double free or corruption (fasttop):

На окнах работает нормально. Я уже обнаружил, что это вызвано деструктором из-за использования insert и =. вероятно, ошибка в этой строке:

ret = trigrams.insert ( pair<string,int>(tempStr,1) );

Но мой вопрос - как это решить? Мне нужно создать копию как карты, так и итератора? Я худею, это будет пустой тратой памяти. Должен ли я перегрузить оператор "=" для создания копии, но как? Я обычно работаю с java, поэтому для меня это действительно связано.

int main(int argc, char *argv[]){
map<string,int> trigrams;
pair<map<string,int>::iterator,bool> ret;
map<string,int>::iterator it;
char tmp[3];
FILE *fp = fopen ("new.txt" , "r");
fseek(fp, 0L, SEEK_END);
size_t fileSize = ftell(fp);
cout<<fileSize<<"\n";
ifstream is("new.txt");
string tempStr;
char c;
int i=0;
it = trigrams.begin(); 
#pragma omp parallel for default(shared) shared(trigrams, c, it, ret)  private(i)   
for(i=0; i<=fileSize;i++)          
{
    if((i%3)==0&&(i!=0)){
        tempStr = tmp;  
        tempStr = tempStr.substr(0,3);
        ret = trigrams.insert ( pair<string,int>(tempStr,1) );
        if (ret.second==false) {
            trigrams[tempStr] += 1;
        }
    }
    c = is.get();
    if(c != '\n')          
        tmp[i%3]=c;
}
is.close();            
ofstream file;
file.open ("new3.txt");
for (it=trigrams.begin(); it!=trigrams.end(); ++it){
    file <<it->first<<"  "<< it->second<<"\n";


}
file.close();
return 0;
}

И вот простая программа, которая работает:

int main(int argc, char *argv[]){
map<int,string> trigrams;
pair<map<int,string>::iterator,bool> ret;
map<int, string>::iterator it;
it = trigrams.begin(); 
for(int i=0; i<=100;i++)          
{
    ret = trigrams.insert ( pair<int, string>(i, "tempStr") );
    it++;
}
for (it=trigrams.begin(); it!=trigrams.end(); ++it){
    cout <<it->first<<"  "<< it->second<<"\n";


}
return 0;
}
  • 0
    Примечание: используйте std::make_pair вместо явного указания аргументов шаблона.
  • 1
    Смотрите этот пост в блоге для получения дополнительной информации о std::make_pair . Кроме того, рассмотрите возможность использования Valgrind, чтобы точно определить, откуда взялся дабл-фри.
Показать ещё 2 комментария
Теги:
destructor

1 ответ

0
Лучший ответ

Я предполагаю, что у вас есть условие гонки здесь - вы одновременно пытаетесь вставить значения в карту из разных потоков, а карта не является потокобезопасной в C++. Гонки могут привести ко многим неприятным вещам, в том числе к двойным бесплатно. Хуже всего то, что поведение программы становится очень случайным, и это может быть причиной того, что он отлично работает на окнах.

  • 0
    У вас есть идеи, как это исправить? Я хотел бы использовать его для паралеллизации openmp позже ... Ошибка вызывается, конечно, без openmp.
  • 0
    Хм, я заметил еще одну вещь - строки в c ++ заканчиваются нулем и поэтому tempStr = tmp; может привести к аварии. Вы можете написать char tmp [4] = {}; Исправить это.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню