Код падает, но работает при работе с Valgrind, но Valgrind сообщает об ошибке - PullRequest
0 голосов
/ 27 октября 2018

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

typedef measure* measure_ptr;

const uint32_t PoolIncrementSize = 50;

void CreatePool()
{
    if(measurePool != nullptr)
    {
        throw std::runtime_error("Pool has already been initialized!");
    }
    poolSize = PoolIncrementSize;
    measure_ptr* createdPool = new measure_ptr[poolSize];
    for(uint32_t i = 0; i < poolSize; i++)
    {
        createdPool[i] = nullptr;
    }
    measurePool = createdPool;
}

void ResizePool()
{
    poolSize += PoolIncrementSize;
    measure_ptr* createdPool = new measure_ptr[poolSize];
    std::memcpy(createdPool, measurePool, (size_t)(poolCursorPosition * sizeof(measure_ptr)));
    delete[] measurePool;
    for(uint32_t i = poolCursorPosition; i < poolSize; i++)
    {
        createdPool[i] = nullptr;
    }
    measurePool = createdPool;
}

// When stuff gets returned to pool this happens
if(poolCursorPosition == poolSize)
    ResizePool();

Программа вылетает при третьей операции изменения размера (размер увеличивается от 150 до> 200) на строке, где я удаляю старый массив.

При работе с Valgrind программа не падает и работает нормально, но Valgrind сообщает о каждом изменении размера для создания нового массива, который Address <some memory address> is 8 bytes after a block of size <correct amount of bytes> allocated И когда я получаю элемент из пула и помещаю nullptr обратно в массив на позицию poolCursorPosition, он сообщает Invalid write of size 8.

Почему код не работает без запуска Valgrind?Что можно сделать, чтобы ошибка Valgrind исчезла?

РЕДАКТИРОВАТЬ:

Добавление кода для доступа к пулу:

void FillPool()
{
    for(uint32_t i = 0; i < PoolIncrementSize; i++)
    {
        if(measurePool[i] == nullptr)
            measurePool[i] = new measure();
    }
    poolCursorPosition = PoolIncrementSize;
}

measure_ptr GetElementFromPool()
{
    if(poolCursorPosition == 0)
    {
        FillPool();
    }
    poolCursorPosition--;
    measure_ptr element = measurePool[poolCursorPosition];
    measurePool[poolCursorPosition] = nullptr;
    return element;
}

void ReturnElementToPool(measure_ptr element)
{
    if(poolCursorPosition == poolSize)
        ResizePool();

    measurePool[poolCursorPosition] = element;

    poolCursorPosition++;
}
...