-4

我试图以编程方式检查我可以分配多大的数组,但我的代码似乎没有检查它。如何让它更快?最后我想得到一个例外。

#include "stdafx.h"
#include "iostream"

using namespace std;
int ASCENDING = 1, DESCENDING = 2;

int tworzTablice(int rozmiar, char* t){
    try{
        t = new char[rozmiar];
        delete []t;
    }catch (std::bad_alloc& e){
        tworzTablice(rozmiar - 1,t);
        return -1;
    }
    return rozmiar;
}

int f(long p, long skok){
    char* t;
    try{
        while(true){
            t = new char[p];
            delete []t;
            p = p + skok;
        }
    }
  catch (std::bad_alloc& ba){
    p = tworzTablice(p-1, t);
    cout<<"blad";
  }
  return p;
}

int main(){
    cout<<f(0, 100000000)<<endl;;


    cout<<"koniec"<<endl;
    system("pause");
    return 0;
}
4

2 回答 2

1

正如我所指出的,有一种方法可以查询操作系统以确定堆分配内存的最大大小,但我无法记住它的名字。

但是,您可以轻松找到自己。但是,您应该使用malloc/free而不是new/delete以避免对所有单元格进行不必要的初始化;

#include <cstdlib>
#include <cstdio>

size_t maxMem() {
  static size_t size = 0;
  if (!size) {
    size_t m = 0;
    for (void* p = 0; (p = malloc(1<<m)); m++)
      free(p);
    while (m) {
      size_t const testSize = size + (1<<(--m));
      if (void* const p = malloc(testSize)) {
        size = testSize;
        free(p);
      }   
    }   
  }
  return size;
}

int main() {
  // forgive me for using printf, but I couldn't remember how to hex-format in std::cout
  printf("%u (hex %X)\n",int(maxMem()),int(maxMem()));
}

在我的 64 位机器上,我得到

2147483647 (hex 7FFFFFFF)

而在另一个 32 系统上我得到

2140700660 (hex 7F987FF4)

然后,如果您确实需要,您可以继续new使用该大小的数组。但是请注意,这是您可以请求的最大连续块。您的进程可能分配的总内存更大,并且取决于安装的 RAM 和保留的交换空间。

于 2013-05-05T14:05:58.427 回答
-1

分配所有可用内存可能不是一个主意,但如果你真的想要:

vector<char*> ptrs;
int avail;
try {
    while (true)
        ptrs.push_back(new char[1000]);
}
catch (bad_alloc& b)
{
    avail = ptrs.size() * 1000;
    for (int i = 0; i < ptrs.size(); i++)
       delete[] ptrs[i];
}
于 2013-05-05T13:13:44.240 回答