【发布时间】:2013-02-07 03:05:25
【问题描述】:
是否可以在标准 C++11 中获取系统(x86、x64、PowerPC / Windows、Linux 或 MacOS)上剩余的可用内存而不会崩溃?
一种天真的方法是尝试从太大的大小开始分配非常大的数组,每次失败时捕获异常并减小大小直到没有抛出异常。但也许有更有效/更聪明的方法......
编辑 1:实际上我不需要确切的内存量。我想知道大约(100MB 的错误栏)我的代码在启动时可以使用多少。
编辑 2: 你觉得这段代码怎么样?在我的程序开始时运行它是否安全,否则可能会损坏内存?
#include <iostream>
#include <array>
#include <list>
#include <initializer_list>
#include <stdexcept>
int main(int argc, char* argv[])
{
static const long long int megabyte = 1024*1024;
std::array<char, megabyte> content({{'a'}});
std::list<decltype(content)> list1;
std::list<decltype(content)> list2;
const long long int n1 = list1.max_size();
const long long int n2 = list2.max_size();
long long int i1 = 0;
long long int i2 = 0;
long long int result = 0;
for (i1 = 0; i1 < n1; ++i1) {
try {
list1.push_back(content);
}
catch (const std::exception&) {
break;
}
}
for (i2 = 0; i2 < n2; ++i2) {
try {
list2.push_back(content);
}
catch (const std::exception&) {
break;
}
}
list1.clear();
list2.clear();
result = (i1+i2)*sizeof(content);
std::cout<<"Memory available for program execution = "<<result/megabyte<<" MB"<<std::endl;
return 0;
}
【问题讨论】:
-
对不起,这次“可能”的两个可能结果中的“否”已经出来了。
-
高度依赖平台,标准中没有处理。
-
没有“标准”方法可以做到这一点。即使您描述的方法也可能不会返回有效结果。您必须使用特定于平台的功能。
-
但至少,幼稚的方式会奏效吗?
-
否 - 以 64 位平台为例,它允许运行 32 位软件。它有 32GB 内存,但 32 位程序无法访问那么多内存。或者考虑一个平台,管理员可以在该平台上对程序可以拥有的内存量实施配额。
标签: c++ exception memory memory-management c++11