Понимание вывода Valgrind

Я пишу проект для университета, все готово, проходит все тесты, работает нормально, но valgrind говорит мне следующее:

==8059== Invalid read of size 8
==8059==    at 0x406E4E: RegPoly::getCurrentCoefficient() const (RegPoly.cpp:59)
==8059==    by 0x403368: MyPoly::operator+(MyPoly const&) const (MyPoly.cpp:281)
==8059==    by 0x403A6D: MyPoly::operator+=(MyPoly const&) (MyPoly.cpp:354)
==8059==    by 0x401E20: main (DemoPoly.cpp:50)
==8059==  Address 0x5953f50 is 0 bytes after a block of size 16 alloc'd
==8059==    at 0x4C27297: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8059==    by 0x4060CD: __gnu_cxx::new_allocator<double>::allocate(unsigned long, void const*) (new_allocator.h:92)
==8059==    by 0x405934: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned long) (in /a/fr-05/vol/home/stud/lablabla/CppLab/Ex3/DemoPoly)
==8059==    by 0x407355: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned long, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (stl_vector.h:1052)
==8059==    by 0x40700E: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (vector.tcc:167)
==8059==    by 0x406C5D: RegPoly::RegPoly(RegPoly const&) (RegPoly.cpp:19)
==8059==    by 0x4031DB: MyPoly::operator=(MyPoly const&) (MyPoly.cpp:249)
==8059==    by 0x403B58: MyPoly::operator*=(MyPoly const&) (MyPoly.cpp:364)
==8059==    by 0x401DB6: main (DemoPoly.cpp:44)

Линии:

44 — p3 *= p2; // both are MyPoly objects

50 — p3 += p1;

Я вроде понимаю, что это означает, что я пытаюсь читать из памяти, которая была изменена (?), Но я не мог понять, почему.
Я мог бы опубликовать соответствующий код, только я не уверен, какая часть, поскольку это сделало бы вопрос беспорядочным. Я могу вставить соответствующие части, просто скажите мне, что вам нужно.

Спасибо!

Редактировать:
Вот код:

MyPoly& MyPoly::operator *=(const MyPoly& rhs)
{
*this = *this * rhs; // 364
return *this;
}

===================

case PolyInterface::REG:
{
RegPoly *tempReg = dynamic_cast<RegPoly*>(rhs.p_PolyBody); // rhs is an interface, hence the dynamic cast
if (tempReg != NULL)
{
p_PolyBody = new RegPoly(*tempReg);  // 249. p_PolyBody is a pointer stored in MyPoly. points to RegPoly object
}
break;
}

===================

RegPoly::RegPoly(RegPoly const& other)
{
gCurrentRank = 0;
gData = other.gData; // 19. gData is a vector<double>
_isZeroPoly = other._isZeroPoly;
}

===================

double RegPoly::getCurrentCoefficient() const
{
return *gDataIterator; // 59. vector<double>::const_iterator
}

===================

newPolyValues.push_back(
p_PolyBody->getCurrentCoefficient() + rhs.p_PolyBody->getCurrentCoefficient());
// 281.

Редактировать:
Я также получаю это, когда getCurrentCoefficient() возвращается gData[gCurrentRank]
Это означает, что это что-то с расположением самого gData, верно?

RegPoly:

std::vector<double> gData;
std::vector<double>::iterator gDataIterator;
int gCurrentRank;
bool _isZeroPoly; // Inherited from the interface

0

Решение

Доверяйте Valgrind, он почти всегда показывает существующие проблемы.

Вот как вы читаете сообщение:

RegPoly::getCurrentCoefficient() const (RegPoly.cpp:59) попытался прочитать из области памяти, которую он не должен был прочитать, потому что он не принадлежит вашему приложению (не был выделен, не в стеке и т. д.). Этот неверный адрес был за пределами пространства, которое было выделено новым оператором, используемым в вашем RegPoly конструктор копирования (и вы можете увидеть всю трассировку, которая создала этот вызов).

Если этого недостаточно, пожалуйста, напишите соответствующий код.

Обновить:

Я не вижу, что копирует ваш конструктор копирования gDataIterator (и между прочим, когда вы копируете, почему вы инициализируете gCurrentRank до 0?).

1

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

Проблема в RegPoly.cpp: 59, а не в DemoPoly.cpp: 50.

Утверждается, что вы выделили 16 байтов, но пытаетесь прочитать 8 байтов сверх вашего выделения.

Видеть это: http://valgrind.org/docs/manual/mc-manual.html#mc-manual.errormsgs

редактировать

Возможно, вы пытаетесь получить доступ к неверному итератору. Константный итератор просто означает, что вы не можете использовать этот итератор для изменения значения внутри контейнера.

Редактировать 2

краткое объяснение связанные с недействительными итераторами.

1

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