Возможно я что-то глупое спрошу, но я уже второй день бьюсь и в инете нигде по сути ответа не могу найти, а сроки поджимают. Ситуация такая: есть код, в котором я создаю массив контейнеров std::list и контейнер std::vector:struct Addresses
{
unsigned short doc;
unsigned short line;
short word;
//unsigned int key;
void operator=(Addresses a);
Addresses();
int Read(int &fileid, const int offset);
};
struct united_list
{
Addresses addr;
int* keys;
united_list()
{
keys=NULL;
};
~united_list()
{
if(keys)
delete[] keys;
keys=NULL;
};
};
typedef list<united_list> addList;
struct TMatch
{
int addr_size;
Addresses* addr;
int key_size;
int* keys;
TMatch();
TMatch(int ad_size, int ky_size);
~TMatch();
void operator=(TMatch a);
void Init(int ad_size, int ky_size);
void clear();
};
addList* bigquery;
vector<TMatch*> result;
Затем происходят вызовы функций таким вот образом:
int Intersect(const int offNum,Dist* &dist,addList* &adds,vector<TMatch*>& result);
в ней вызывается функция
void IntersectPair(const int i,Dist* &dist,addList* &adds);
в обеих, обратите внимание, третий параметр - ссылка на созданый выше bigquery, result - он везде тот же result. Однако IntersectPair объекта result вообще не касается, при этом когда я после операций в IntersectPair пытаюсь сделать result.reserve(xxx); он пишет про ошибку glibc про corrupt list. Закоментировав вызов IntersectPair, ошибка исчезает, однако, естественно код работает неправильно.
Возможно следующее подскажет, в чем может быть проблема. В том же месте кода я сделал такую вот трассировку:
for(i=0;i<__size;i++)
{
resultSet=new TMatch(offNum,__sorter.key_sort_num);
resultSet->addr[offNum-1]=adds_i_current_iterator->addr;
result.push_back(resultSet);
if(!i)
{
cout<<resultSet->addr[0].doc<<"."<<resultSet->addr[0].line<<"."<<resultSet->addr[0].word<<endl;
cout<<adds_i_current_iterator->addr.doc<<"."<<adds_i_current_iterator->addr.line<<"."<<adds_i_current_iterator->addr.word<<endl;
cout<<result[0][0].addr[0].doc<<"."<<result[0][0].addr[0].line<<"."<<result[0][0].addr[0].word<<endl;
}
adds_i_current_iterator++;
}
cout<<result[0][0].addr[0].doc<<"."<<result[0][0].addr[0].line<<"."<<result[0][0].addr[0].word<<endl;
adds[offNum-1].clear();
cout<<result[0][0].addr[0].doc<<"."<<result[0][0].addr[0].line<<"."<<result[0][0].addr[0].word<<endl;
а выдал он мне такую вот фишку:
1.2.2
1.2.2
1.2.2
1.2.2
6587.230.0
Опять же, за коментировав
adds[offNum-1].clear()
вывод становится нормальным
1.2.2
1.2.2
1.2.2
1.2.2
1.2.2
Кстати, в обоих случаях последующие элементы вектора results не страдают и нормально обрабатываются.
ну то есть получается, что после вызова adds[offNum-1].clear(); у меня портится содержимое вектора result, хотя везде происходит присваивание по значениям, то есть создается где нужно новый обхъект, аллоцируется оператором new память и туда в нужные места заливаются значения соответственные.
Помогите, пожалуйста, я ума не приложу, как у меня могут так хитро переплестись контейнеры. Скажите, если нужно дополнительно код выложить. Заранее спасибо.