C++ 如何检查是否有足够的堆内存可用?

C++ 如何检查是否有足够的堆内存可用?,c++,visual-c++,heap-memory,C++,Visual C++,Heap Memory,我有一个赋值要求我创建一个“Heap”类来分配和释放内存。我相信我的代码可以正常工作,解决方案可以正常构建和运行,但我希望确保没有内存泄漏。我还需要添加一些代码来检查分配给堆的所需数量是否可用……如果有人分配了非常大的数量。如何检查堆上分配的内存是否可用,或者如果没有足够的内存,如何检查是否为空。以下是我目前的代码: #include <iostream> using namespace std; class Heap{ public: double* allocateMemor

我有一个赋值要求我创建一个“Heap”类来分配和释放内存。我相信我的代码可以正常工作,解决方案可以正常构建和运行,但我希望确保没有内存泄漏。我还需要添加一些代码来检查分配给堆的所需数量是否可用……如果有人分配了非常大的数量。如何检查堆上分配的内存是否可用,或者如果没有足够的内存,如何检查是否为空。以下是我目前的代码:

#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;
}
#包括
使用名称空间std;
类堆{
公众:
双*分配内存(int memorySize)
{
返回新的双精度[记忆大小];
};
void deallocateMemory(双倍*dMemorySize)
{
删除[]dMemorySize;
};
};
int main()
{
堆;
库特记忆;
double*chunkNew=heap.allocateMemory(hMemory);

cout无需事先检查,只需尝试分配内存,如果无法分配,则捕获异常。在这种情况下,它的类型为
bad\u 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;
};
这可以防止出现以下问题:

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

非常感谢你的帮助。很高兴帮助你。我更新了答案,因为你评论…有一个重要的注意事项。实际上……在删除之前,不必检查<代码> null <代码>,请参阅我的错误,我打算防止一个不同的问题:双释放。回答已经被编辑。考虑使用以检查内存LEA。ks.请将8号改为sizeof(双码)
double *chunkNew = heap.allocateMemory(hMemory);
heap.deallocateMemory(chunkNew);
heap.deallocateMemory(chunkNew); // chunkNew has been freed twice!