我试图以编程方式检查我可以分配多大的数组,但我的代码似乎没有检查它。如何让它更快?最后我想得到一个例外。
#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;
}
答案 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];
}