Вставка нового элемента в динамический массив указателей на объекты - PullRequest
0 голосов
/ 19 мая 2018

У меня есть класс, представляющий массив, содержащий указатели на другие мои объекты класса.

#include "Edge.h"  
class Array
{
private:
    Edge** _headPtr;    
    int arraySize;      

public:
    Array(int);
    void pushBack(Edge*);
    // other functions...
};

Array::Array(int arraySize)
{
    this->arraySize = arraySize;
    this->_headPtr = new Edge*[arraySize];
}

Программа всегда возвращает ошибки выделения памяти после вызова

// inserts an element on the end of the array
void Array::pushBack(Edge* element)
{
    if (arraySize == 0) {
        _headPtr = new Edge*[1];
        _headPtr[0] = element;
        arraySize++;
    }
    else {
        Edge** _tempPtr = new Edge*[arraySize + 1]; // crashing here            
        memcpy(_tempPtr, _headPtr, arraySize * sizeof(Edge*));

        //for (int i = 0; i < arraySize; i++) delete _headPtr[i];
        delete[] _headPtr;

        _tempPtr[arraySize] = element;
        _headPtr = _tempPtr;
        arraySize++;
    }
}

Я закомментировал часть for (int i = 0; i < arraySize; i++) delete _headPtr[i];, поскольку она вызывала ошибку _free_dbg(block, _UNKNOWN_BLOCK);.

Из того, что я нашел в других вопросах здесь, я предполагаю, что в моем понимании динамического массива указателей на объекты классов должен быть недостаток, но, потратив много времени на попытки исправить это, я исчерпалИдеи.
Общая идея моей программы - выполнить измерения эффективности времени для некоторых алгоритмов графов, что является частью реализации алгоритма Прима.
Стек вызовов, приводящий к этой ситуации, выглядит следующим образом:

    BinaryHeap queue = BinaryHeap();
    queue.addNewElement(new Edge(v, v2, edgeWeight));
    which looks like this
    void BinaryHeap::addNewElement(Edge* element)
    {
        heapElements->pushBack(element);
        heapFix_UP(heapElements->getSize()-1);
    }
    And finally pushBack method.

heapElements - это Array* heapElements внутри класса BinaryHeap, инициализированный
heapElements = new Array(); в конструкторе BinaryHeap.
Edge - очень простой класс, содержащий только три целочисленных значения.
Пожалуйста, не предлагайте использовать std:: vector, вся идея не в том, чтобы использовать STL.

1 Ответ

0 голосов
/ 19 мая 2018

ОК, я нашел решение.Весь приведенный выше код работает хорошо, ошибка была в совершенно ином месте в моем коде.
Что было такого неправильного, что это приводило к сбою всей программы спустя много строк?
This:

int** graphMatrix;
graphMatrix = new int*[vertex];
for (i = 0; i < edges; i++) graphMatrix[i] = new int[edges];

Так просто, но так вредно.
Это часть моей реализации матрицы инцидентности.Теперь причина всех сбоев довольно очевидна - попытка записи / чтения нераспределенной памяти и повреждение кучи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...