Ошибка неверного размера чтения на карте с использованием valgrind

У меня есть этот код для заполнения таблицы, но я получаю ошибку сегментации. Я нахожусь в конце своего ума, пытаясь выяснить, в чем может быть ошибка. Моя функция берет 2 карты и перебирает их, чтобы найти общие строки. Он принимает значение int этих общих строк и помещает его в таблицу, чтобы подсчитать, сколько раз встречаются общие строки.

myMap findTable(mapGraph * dbgraph1, mapGraph * dbgraph2)
{
typedef mapGraph::const_iterator iter;
typedef myMap::const_iterator mapiter;

iter it1 = dbgraph1->begin();
iter it2 = dbgraph2->begin();
int count =0;
myMap * newTable = NULL;

//iterating through the 2 samples of dbgraphs
while (it1 != dbgraph1->end() && it2 != dbgraph2->end())
{
//a match is found for 2 strings
if (it1->first == it2->first)
{
//the component ids of first sample
int compdb1 = it1->second->comp;

//the component ids of second sample
int compdb2 = it2->second->comp;

//inserting the component ids and counts in the map
newTable->insert(make_pair(make_pair(compdb1, compdb2), count));
count++;

for (mapiter it = newTable->begin(); it != newTable->end(); it++)
{
printf("%i %i\t %i\n", it->first.first, it->first.second, it->second);
}

it1++;
it2++;

}

//match not found
else
it1++;
it2++;

}
printf("\nCLEAR\n");
return newTable;
}

Это ошибка:

Address 0x10 is not stack'd, malloc'd or (recently) free'd
Invalid read of size 8
Process terminating with default action of signal 11 (SIGSEGV)
Access not within mapped region at address 0x10

-1

Решение

newTable является NULL:

myMap * newTable = NULL;

и никогда не назначается действительному объекту раньше:

newTable->insert(make_pair(make_pair(compdb1, compdb2), count));

Разыменование NULL указатель является неопределенным поведением. Либо динамически выделять myMap экземпляр для newTable:

myMap* newTable = new myMap(); // Remember to delete later.

или использовать выделенный стеком экземпляр:

myMap newTable;

Это ошибка:

//match not found
else
it1++;
it2++;

в результате чего it2 увеличивается на каждой итерации цикла и приведет к ++ вызывается на end() итератор. Изменить на:

//match not found
else
{
it1++;
it2++;
}

Или, чтобы упростить код, просто увеличивайте итераторы в одном месте цикла, так как они увеличиваются всегда (в каждой ветви if\else).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]