Я получаю это сообщение после запуска моей программы в системе 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;
}
Я предполагаю, что у вас есть условие гонки здесь - вы одновременно пытаетесь вставить значения в карту из разных потоков, а карта не является потокобезопасной в C++. Гонки могут привести ко многим неприятным вещам, в том числе к двойным бесплатно. Хуже всего то, что поведение программы становится очень случайным, и это может быть причиной того, что он отлично работает на окнах.
std::make_pair
вместо явного указания аргументов шаблона.std::make_pair
. Кроме того, рассмотрите возможность использования Valgrind, чтобы точно определить, откуда взялся дабл-фри.