У меня есть массив массивов объектов, которыми я управляю.Пул увеличивается по требованию до бесконечности, пока не закончится программа.Когда я пытаюсь изменить размер пула, он переживает первые три операции изменения размера, а затем падает на четвертом при удалении старого массива.Размер пула небольшой, а память не исчерпывается.
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++;
}