2014-11-14 1 views
-1

Я пытался написать код, чтобы узнать длину самой длинной повторяющейся подстроки в заданной строке.Ошибка mysterios malloc во время выполнения

Код выглядит следующим образом.

#include<cstdio> 
#include<cstdlib> 
#include<cstring> 
#include<limits> 
#include<iostream> 
#include<map> 
using namespace std; 


class trienode 
{ 
    private: 
     int value; 
     trienode *child[156]; 
    public: 
     trienode() 
     { 
      value=0; 
      for(int i=0;i<256;i++) 
      { 
       child[i]=NULL; 
      } 
     } 
     void insert(string str,int *,int *); 
};  


class trie 
{ 
    private: 
     trienode *head; 
     int max; 
    public: 
     trie(string str) 
     { 
      head=new trienode(); 
      max=0; 
      insert(str); 
     } 
     void insert(string); 
     int getmax(); 
}; 

void trie::insert(string str) 
{ 
    int n=str.length(); 
    for(int i=0;i<n;i++) 
    { 
     int result=0; 
     int set=0; 
     cout << "inside trie insert" <<str<<endl; 
     cout << "inside trie insert" <<str.substr(i)<< " " << str<<endl; 
     cout << "inside trie insert" <<str<<endl; 
     head->insert(str.substr(i),&set,&result); 
     cout << "inside trie insert" <<str<<endl; 
     if(result>max) 
      max=result; 
    } 
} 

void trienode::insert(string str,int *set,int *res) 
{ 
    cout << "inside trienode insert" <<endl; 
    if(str.length()>0) 
    { 
     if(str.length()==1) 
      value=1; 
     if(child[str.at(0)]!=NULL) 
     { 
      *set=1; 
      child[str.at(0)]=new trienode(); 
     } 
     else 
     { 
      if(!set) 
       *res++; 
      child[str.at(0)]->insert(str.substr(1),set,res); 
     } 
    } 
} 

int trie::getmax() 
{ 
    return max; 
} 
int main() 
{ 
    //char arr1[]="ATCGATCGA"; 
    trie t("ATCGATCGA"); 
    cout << t.getmax() <<endl; 

    return 0; 
} 

Когда я пытаюсь запустить эту program.The следующей ошибки во время выполнения был thrown.I не смог найти какую-либо ошибки в коде.

malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed. 
Aborted (core dumped) 

Я указал, где именно была замечена ошибка.

Ошибка была замечена в этом фрагменте кода.

void trie::insert(string str) 
    { 
     int n=str.length(); 
     for(int i=0;i<n;i++) 
     { 
      int result=0; 
      int set=0; 
      cout << "inside trie insert" <<str<<endl; 
      cout << "inside trie insert" <<str.substr(i)<< " " << str<<endl; 
      cout << "inside trie insert" <<str<<endl; 
      head->insert(str.substr(i),&set,&result); 
      cout << "inside trie insert" <<str<<endl; 
      if(result>max) 
       max=result; 
     } 
    } 

Первый соиЬ cout << "inside trie insert" <<str<<endl; успешна.

Второй cout cout << "inside trie insert" <<str.substr(i)<< " " << str<<endl; где ошибка.

Кто-то, пожалуйста, помогите мне, поскольку я застрял в этой проблеме.

Спасибо ..

+3

Размер массива 'trienode :: child' должен быть 256. – reima

ответ

4

Причина у вас возникли проблемы, потому что вы объявили child как вектор с только 156 элементов, но доступ к 256 в вашем for цикле. Это каскадирует множество потенциальных неопределенных действий.

+0

Спасибо .. Это помогло .. Мой плохой .. – starkk92