Недопустимое чтение размера 4, увеличивающего размер массива - PullRequest
0 голосов
/ 29 августа 2018

У меня 4 ошибки при запуске Valgrind при увеличении массива (изначально размером 10), который я использую для шаблонного стека, valgrind дает мне 4 ошибки, когда я пытаюсь добавить 11-й элемент в массив (именно тогда, когда я приходится увеличивать размеры при толчке):

class stack {

private:
    int _size = 10;
    T *_data;
    int _top;
    int _count = 0;

public:

// costructor used
   stack(int s) {
       this->_size = s;
       _data = new T[_size];
       this->_top = -1;

   }

   ....

   void push(T v) {
        if (_count <= _size) {

        this->_top++;
        this->_data[_top] = v;  
        this->_count++;
       }else{
        //HEAP ERRORS HERE ++++++++
        _size++;
        T *temp = new T[_size];
         for(int i = 0; i < _top; i++) {
            temp[i] = _data[i];
        }
        delete [] _data;
        _data=temp;
        _data[_top] = v;        
        this->_top++;
        this->_count++;         
    }

Я не уверен насчет оператора new и оператора delete [] после оператора else, я думаю, что у меня просто проблемы, но я не мог найти другой способ их решения.

В main.cpp я помещаю только 11 элементов в шаблонный стек:

stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
s.push(7);
s.push(8);
s.push(9);
s.push(10);
s.push(11);

это вывод Вальгринда

 ==4178== Invalid write of size 4
 ==4178==    at 0x10921E: stack<int>::push(int) (stack.h:85)
 ==4178==    by 0x108ED2: main (main.cpp:32)
 ==4178==  Address 0x5b82ca8 is 0 bytes after a block of size 
 40 alloc'd
 ==4178==    at 0x4C3089F: operator new[](unsigned long) (in 
 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
 ==4178==    by 0x109144: stack<int>::stack() (stack.h:28)
 ==4178==    by 0x108B8D: main (main.cpp:9)
  HEAP SUMMARY:
 ==4178==     in use at exit: 0 bytes in 0 blocks
 ==4178==   total heap usage: 4 allocs, 4 frees, 73,808 bytes 
 allocated
 ==4178== 
 ==4178== All heap blocks were freed -- no leaks are possible
 ==4178== 
 ==4178== For counts of detected and suppressed errors, rerun with: -v
 ==4178== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 
 0)

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы сказали, что 11-е нажатие вызывает ошибку. Кажется, причина в <=. Когда count равно size, вы должны расширить массив, но ваш код выталкивает элемент за конечный элемент.

Обратите внимание, что распространенным случаем являются ошибки на краях диапазона. Чтобы избежать таких вещей, используйте юнит-тесты. Также старайтесь избегать разработки вещей, которые уже сделаны, просто используйте один из существующих.

0 голосов
/ 29 августа 2018

Как уже упоминал Дэйв S, условие if (_count <= _size) приводит к повреждению вашей кучи. Изменение условия на if (_count < _size) приведет к ожидаемому поведению.

На самом деле, вы будете выполнять итерацию от 0 до 10 для одиннадцати общих нажатий, прежде чем вызвать переполнение.

...