удалить [], давая обнаружение повреждения кучи - PullRequest
0 голосов
/ 11 декабря 2018

Я получаю сообщение об ошибке повреждения кучи при вызове моего удаления в main.Но я ясно вижу, что мои значения в моем динамически размещенном массиве отображаются.Я проверил несколько других статей, но я запутался в своем конкретном случае относительно того, что я сделал неправильно.Предполагается, что динамически распределяемый массив содержит элементы массива исходного массива, которые больше или равны 10. Именно поэтому 11 и 13 отображаются при выводе элементов массива в новый динамически распределяемый массив.

#include <iostream>
#include <string>
#include <new>
#include <cmath>
#include <cstdlib>

using namespace std;

bool interesting(unsigned n);
unsigned * cull(unsigned & intEls, const unsigned ar[], unsigned els);

int main(){
    unsigned ar1[5] = { 3,5,7,11,13 };
    unsigned size;
    unsigned * result = cull(size,ar1,5);
    for (unsigned i = 0; i < size; i++) {
        cout << result[i];
    }
    delete[] result;
}

bool interesting(unsigned n){
    if (n >= 10)
        return true;
    else {
        return false;
    }
}

unsigned * cull(unsigned & intEls, const unsigned ar[], unsigned els){
    intEls = 0;
    unsigned * array = new unsigned[intEls];
    for (unsigned i = 0; i < els; i++) {
        if (interesting(ar[i])) {
            array[intEls++] = ar[i];        
        }
    }
    return array;
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В функции cull массив array создается с размером 0 (intEls равен 0, когда вызывается new unsigned [intEls].)

array[intEls++] уже неверен, массиввыделенный с new[] не может быть изменен.Они не вызывают ошибку, потому что C ++ не выполняет автоматическую проверку границ для массивов (может привести к накладным расходам).Это неопределенное поведение , означающее, что он может быть в любом случае завершен неудачей.

Исправление этой программы - просто выделить массив с new unsigned[els].

Лучше было бы использовать std::vector<unsigned> вместо необработанных массивов.

0 голосов
/ 11 декабря 2018

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

intEls = 0;
unsigned * array = new unsigned[intEls];
//                              ^^^^^^  this should be els
...