Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the remaining available memory in standard C++11?

Is it possible to get the remaining available memory on a system (x86, x64, PowerPC / Windows, Linux or MacOS) in standard C++11 without crashing ?

A naive way would be to try allocating very large arrays starting by too large size, catch exceptions everytime it fails and decrease the size until no exception is thrown. But maybe there is a more efficient/clever method...

EDIT 1: In fact I do not need the exact amount of memory. I would like to know approximately (error bar of 100MB) how much my code could use when I start it.

EDIT 2 : What do you think of this code ? Is it secure to run it at the start of my program or it could corrupt the memory ?

#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;
}
like image 512
Vincent Avatar asked Feb 21 '13 17:02

Vincent


1 Answers

This is highly dependent on the OS/platform. The approach that you suggest need not even work in real life. In some platforms the OS will grant you all your memory requests, but not really give you the memory until you use it, at which point you get a SEGFAULT...

The standard does not have anything related to this.

like image 120
David Rodríguez - dribeas Avatar answered Sep 20 '22 09:09

David Rodríguez - dribeas