Повреждение кучи

270
08 декабря 2017, 04:29

По заданию необходимо считать строки и затем рассортировать четно-нечетной сортировкой слияния Бэтчера. Нельзя использовать stl контейнеры, поэтому сделал свой вектор, в который отправляю строки. Без сортировки все работает нормально, но при попытке отсортировать в функции unshuffle в последнем цикле вылетает с ошибкой повреждения кучи.

По отладке tmp имеет тот же размер что и a, не понимаю почему в итоге вылезает за границы дозволенного. Пробовал делать цикл на меньшее количество итераций, но тогда ошибка кучи вылезает сразу же при заходе в него.

class TVector {
private:
    int capacity;
public:
    char** array;
    int size;
    /....../
};

TVector::TVector() {
    size = 0;
    capacity = 1;
    array = new char*[capacity];
}
TVector::TVector(const size_t & sizeVector) {
    capacity = sizeVector;
    size = sizeVector;
    array = new char*[sizeVector];
}
void TVector::Push_back(char* &temp) {
    if (size == capacity) {
        capacity *= 2;
        char* *result = new char*[capacity];
        for (int index = 0; index < size; index++) {
            result[index] = array[index];
        }
        delete[] array;
        this->array = result;
    }
    array[size++] = temp;
}

int TVector::Size() const {
    return size;
}
int TVector::Capacity() const {
    return capacity;
}

TVector::~TVector() {
    delete[] array;
}
void TVector::OddEvenMergeSort(TVector& a, int l, int r, int size) {
    if (r == l + 1) compexch(a.array[l], a.array[r], size);
    if (r < l + 2) return;
    unshuffle(a, l, r);
    int half = (l + r) / 2;
    OddEvenMergeSort(a, l, half, size);
    OddEvenMergeSort(a, half + 1, r, size);
    shuffle(a, l, r);
    for (int i = l + 1; i < r; i += 2)
        compexch(a.array[i], a.array[i + 1], size);
    int halfSize = (r - l + 1) / 2 - 1;
    for (int i = l + 1; i + halfSize < r; i++)
        compexch(a.array[i], a.array[i + halfSize], size);
}

void TVector::compexch(char* &a, char* &b, int size)
{
    if (strcmp(b,a))
        swap(a, b, size);
}
void TVector::swap(char* &a, char* &b, int size) {
    char* temp = new char(size + 1);
    temp = b;
    b = a;
    a = temp;
}
void TVector::shuffle(TVector& a, int l, int r)
{
    int half = (l + r) / 2;
    TVector tmp(a.Size());
    int i, j;
    for (i = l, j = 0; i <= r; i += 2, j++)
    {
        tmp.array[i] = a.array[l + j];
        tmp.array[i + 1] = a.array[half + j + 1];
    }
    for (int i = 0; i < tmp.Size(); i++)
        a.array[i] = tmp.array[i];
}
void TVector::unshuffle(TVector& a, int l, int r)
{
    int half = (l + r) / 2;
    TVector tmp(a.Size());
    int i, j;
    for (i = l, j = 0; i <= r; i += 2, j++)
    {
        tmp.array[l + j] = a.array[i];
        tmp.array[half + j + 1] = a.array[i + 1];
    }
    for (int i = 0; i < tmp.Size() - 1; i++) {
        a.array[i] = tmp.array[i]; //краш
    }
}
int main(void) {
    TVector v;
    int size = 0, s = 5;
    printf("Max strlen\n");
    scanf("%d", &size);
    char *data = new char[size + 1];
    char *dadia = new char[size + 1];
    while (gets_s(data, size) && s > 0) {
        s--;
        dadia = _strdup(data);
        v.Push_back(dadia);
    }
    if (v.Size() > 1) {
        v.OddEvenMergeSort(v, 0, v.Size() - 1, size);
    }
    for (int i = 0; i < v.Size(); ++i) {
        printf("%s\n", v.array[i]);
    }
    return 0;
}

Ошибка:

  • HEAP CORRUPTION DETECTED: after Normal block (#85) at 0x0037B470.
  • CRT detected that the application wrote to memory after end of heap
    buffer.
READ ALSO
Решить пример на С++ [требует правки]

Решить пример на С++ [требует правки]

Не получается описать данный пример на С++, пытался через массивы, но получалась полная каша

261
Оператор присваивания в C++

Оператор присваивания в C++

Есть несколько моментов в описании оператора присваивания (assignment operator) в стандарте языка, которые мне не ясны, и хотелось бы их прояснить

325
Удаление Activity из бэкстека

Удаление Activity из бэкстека

Есть приложения в котором есть StartActivity в котором загружается данные с сервераПосле данные передаются в MainActivity где данные обрабатываются...

259
Перехват завершения процесса

Перехват завершения процесса

Добрый деньСуществует некая функция, структура которой:

253