Имейте в виду, что в 32-битных системах стек растет вниз, а куча растет вверх, и эти два могут встретиться где-то посередине. Следовательно, пространство может быть выделено для стека или кучи, но не для обоих одновременно. Обратите внимание, что сегменты разделяемой памяти (если вы их используете) усложняют карту памяти. Так что можно динамически загружать (совместно использовать) библиотеки.
+------------+
| stack | high addresses
| | |
| v |
+------------+
| |
| unused |
| |
+------------+
| |
| ^ |
| | |
| heap |
| |
+------------+
| |
| bss |
| |
+------------+
| |
| data |
| |
+------------+
| |
| text |
| | low addresses
+------------+
В 64-битной системе достаточно адресного пространства, чтобы вы исчерпали реальную и виртуальную память до возникновения коллизий.
Кроме того, обратите внимание, что (по крайней мере, в некоторых версиях) Linux хочет сказать, что может быть выделено больше памяти, чем они могут реально поддерживать - они чрезмерно фиксируют. Это не очень хорошо. Это означает, что практические эксперименты, такие как пробное выделение памяти, могут дать вам ложное чувство безопасности.
Скорее всего, вам лучше спросить «осталось ли x МБ (ГБ?) Свободного места», а не «сколько осталось МБ (ГБ?)». Другие люди указывали на файловую систему /proc
как на источник информации о том, сколько памяти используется. Я не уверен, достоверно ли он говорит вам о том, сколько памяти доступно для захвата.