Как я могу проверить, достаточно ли памяти в куче?

У меня есть назначение, которое требует от меня создать класс «кучи», который выделяет и освобождает память. Я верю, что мой код работает, а решение строится и работает правильно, но я хочу убедиться, что у меня нет утечек памяти. Мне также нужно добавить некоторый код, который проверяет, доступна ли желаемая сумма для кучи, даже если кто-то выделит очень большую сумму. Как можно проверить, доступна ли память, выделенная в куче, или NULL, если не хватает памяти. Вот мой код до сих пор:

#include <iostream>
using namespace std;

class Heap{
public:

double* allocateMemory(int memorySize)
{
return new double[memorySize];
};
void deallocateMemory(double* dMemorySize)
{
delete[] dMemorySize;
};

};

int main()
{
Heap heap;
cout << "Enter the number of double elements that you want to allocate: " << endl;
int hMemory;
const int doubleByteSize = 8;
cin >> hMemory;

double *chunkNew = heap.allocateMemory(hMemory);

cout << "The amount of space you took up on the heap is: " <<
hMemory*doubleByteSize << " bytes" <<
starting at address: " << "\n" << &hMemory << endl;

heap.deallocateMemory(chunkNew);

system("pause");
return 0;
}

8

Решение

Нет необходимости проверять заранее, просто попробуйте выделить память, и если вы не можете, то поймайте исключение. В этом случае это типа bad_alloc,

#include <iostream>
#include <new>      // included for std::bad_alloc

/**
* Allocates memory of size memorySize and returns pointer to it, or NULL if not enough memory.
*/
double* allocateMemory(int memorySize)
{
double* tReturn = NULL;

try
{
tReturn = new double[memorySize];
}
catch (bad_alloc& badAlloc)
{
cerr << "bad_alloc caught, not enough memory: " << badAlloc.what() << endl;
}

return tReturn;
};

Важная заметка

Обязательно защититесь от двойного освобождения памяти. Один из способов сделать это — передать указатель на deallocateMemory по ссылке, позволяя функции изменить значение указателя на NULLтем самым предотвращая возможность delete— дважды указатель

void deallocateMemory(double* &dMemorySize)
{
delete[] dMemorySize;
dMemorySize = NULL; // Make sure memory doesn't point to anything.
};

Это предотвращает проблемы, подобные следующим:

double *chunkNew = heap.allocateMemory(hMemory);
heap.deallocateMemory(chunkNew);
heap.deallocateMemory(chunkNew); // chunkNew has been freed twice!
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]