Valgrind C++ : Invalid Read Of Size 8 -
iv'e been having problem while trying create generic priority queue.
valgrind gives me these errors :
heap summary: ==39639== in utilize @ exit: 0 bytes in 0 blocks ==39639== total heap usage: 22 allocs, 22 frees, 1,811 bytes allocated ==39639== ==39639== heap blocks freed -- no leaks possible ==39639== ==39639== error summary: 4 errors 2 contexts (suppressed: 6 6) ==39639== ==39639== 2 errors in context 1 of 2: ==39639== invalid read of size 8 ==39639== @ 0x405fb5: mtm::priorityqueue<int, assignment>::iterator::operator++() (priority_queue.h:505) ==39639== 0x405d2e: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator, mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:808) ==39639== 0x403bc0: eraseandsizetest() (priority_queue_test.cpp:119) ==39639== 0x404d6b: main (priority_queue_test.cpp:136) ==39639== address 0x5141c88 24 bytes within block of size 32 free'd ==39639== @ 0x4a05fd6: operator delete(void*) (vg_replace_malloc.c:480) ==39639== 0x405b1b: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:768) ==39639== 0x405d04: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator, mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:809) ==39639== 0x403bc0: eraseandsizetest() (priority_queue_test.cpp:119) ==39639== 0x404d6b: main (priority_queue_test.cpp:136) ==39639== ==39639== ==39639== 2 errors in context 2 of 2: ==39639== invalid read of size 8 ==39639== @ 0x4ccb870: std::string::size() const (basic_string.h:713) ==39639== 0x4050e8: __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /u1/115/saoren/mtm/hw5/wet5/prog) ==39639== 0x405048: assignment::operator==(assignment const&) const (priority_queue_test.cpp:26) ==39639== 0x406337: mtm::priorityqueue<int, assignment>::iterator::operator==(mtm::priorityqueue<int, assignment>::iterator const&) const (priority_queue.h:553) ==39639== 0x406010: mtm::priorityqueue<int, assignment>::iterator::operator=(mtm::priorityqueue<int, assignment>::iterator const&) (priority_queue.h:451) ==39639== 0x405d1b: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator, mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:809) ==39639== 0x403bc0: eraseandsizetest() (priority_queue_test.cpp:119) ==39639== 0x404d6b: main (priority_queue_test.cpp:136) ==39639== address 0x5141c70 0 bytes within block of size 32 free'd ==39639== @ 0x4a05fd6: operator delete(void*) (vg_replace_malloc.c:480) ==39639== 0x405b1b: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:768) ==39639== 0x405d04: mtm::priorityqueue<int, assignment>::erase(mtm::priorityqueue<int, assignment>::iterator, mtm::priorityqueue<int, assignment>::iterator) (priority_queue.h:809) ==39639== 0x403bc0: eraseandsizetest() (priority_queue_test.cpp:119) ==39639== 0x404d6b: main (priority_queue_test.cpp:136) ==39639== --39639-- --39639-- used_suppression: 4 u1004-arm-_dl_relocate_object --39639-- used_suppression: 2 glibc-2.5.x-on-suse-10.2-(ppc)-2a ==39639== ==39639== error summary: 4 errors 2 contexts (suppressed: 6 6) and here code (relevent parts, believe) :
template<typename priority, typename t> typename priorityqueue<priority, t>::iterator priorityqueue<priority, t>::iterator::operator+( int offset) { if (offset == 0) { homecoming *this; } iterator = *this; (int = 0; < offset; i++) { it++; } //todo: should allocate newiterator new ?? homecoming it; }` `template<typename priority, typename t> typename priorityqueue<priority, t>::iterator priorityqueue<priority, t>::iterator::operator++() { //todo: check if not null if (this->data != nullptr) { info = data->next; index++; } homecoming *this; } template<typename priority, typename t> typename priorityqueue<priority, t>::iterator priorityqueue<priority, t>::iterator::operator++( int) { iterator = *this; if (this->data != nullptr) { if (this->data->next == nullptr) { info = nullptr; index++; homecoming *this; } info = data->next; index++; } homecoming it; } template<typename priority, typename t> typename priorityqueue<priority, t>::iterator priorityqueue<priority, t>::erase( iterator exactposition) { if (elementsno == 0) { homecoming end(); } bool lastone = false; bool firstone = false; lastone = exactposition + 1 == end(); firstone = exactposition == begin(); if (firstone) { elementsno--; head = head->next; delete (exactposition.data); exactposition.data = nullptr; homecoming begin(); } iterator previousposition = begin(); while (previousposition.data->next != exactposition.data) { previousposition++; } if (lastone) { elementsno--; delete exactposition.data; previousposition.data->next = nullptr; homecoming end(); } node* next = exactposition.data->next; previousposition.data->next = next; delete exactposition.data; exactposition.data = nullptr; this->elementsno--; homecoming iterator(next, exactposition.index + 1); } template<typename priority, typename t> typename priorityqueue<priority, t>::iterator priorityqueue<priority, t>::erase( iterator start, iterator end) { if (!size()) { homecoming end; } //todo: check boundries (start after end) iterator iterator = start; //foreach(iterator,start,end) (iterator = start; != end; ++i) { iterator = erase(iterator); } homecoming ++iterator; template<typename priority, typename t> bool priorityqueue<priority, t>::iterator::operator==( const iterator& original) const { if (data == nullptr && original.data == nullptr) { homecoming true; } if (data == nullptr || original.data == nullptr) { homecoming false; } homecoming data->element.data == original.data->element.data; } i appreciate if spot faults , allow me know though there lot of functions , lot of errors it's goes downwards erase give thanks you
oa
in erase( iterator start, iterator end) function next @ end of function:
homecoming ++iterator; if end iterator passed function in fact container's end iterator you're returning iterator that's past end of container.
since erase( iterator exactposition) returns iterator next 1 erased, should homecoming iterator erase( iterator start, iterator end).
c++ valgrind
No comments:
Post a Comment