创建可以分配的最大字符数组

时间:2013-05-05 13:10:27

标签: c++ arrays memory

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

#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;
}

2 个答案:

答案 0 :(得分: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和保留的交换空间。

答案 1 :(得分:-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];
}