автоматическое / статическое распределение памяти - PullRequest
4 голосов
/ 07 декабря 2010

Возможно наивный вопрос, но ...

Подтвердить или опровергнуть:

Наличие памяти для объектов /Переменные автоматической и статической длительности хранения определяются во время компиляции, и существует абсолютно нулевая вероятность того, что программа не выполнится во время выполнения, поскольку для автоматического объекта было недостаточно памяти.

Естественно, когда конструкторавтоматического объекта выполняет динамическое распределение, и такое распределение завершается неудачно, мы считаем это ошибкой при динамическом размещении, а не автоматическим.

Ответы [ 6 ]

14 голосов
/ 07 декабря 2010

Автоматическое распределение, безусловно, может дать сбой - обычно это называется переполнением стека.Вы видите это довольно часто, когда кто-то пытается использовать переменный большой массив в качестве локальной переменной.Неограниченная (или недостаточно ограниченная) рекурсия также может вызывать это.

Чего вы не можете сделать независимым от платформы способом, так это обнаружить ошибку автоматического распределения и обработать ее.

13 голосов
/ 07 декабря 2010

Два слова: Переполнение стека . : P

4 голосов
/ 07 декабря 2010

В системах с избыточной загрузкой (например, Linux в конфигурации по умолчанию) даже объекты статической длительности хранения могут привести к сбою во время выполнения.При запуске программы эти объекты будут существовать либо в нулевых страницах копирования при записи (если они не были инициализированы), либо в сопоставлениях копирования при записи исполняемого файла на диске.После первой попытки записи в них произойдет сбой страницы, и ядро ​​сделает локальную изменяемую копию для вашего процесса.Если ядро ​​было небрежно и не зарезервировало столько памяти, сколько было выделено для этого процесса, это может привести к сбою, и результатом будет страшный OOM-killer.

Ни у одной надежной системы такой проблемы нет, и Linuxповедение может быть исправлено с помощью:

echo "2" > /proc/sys/vm/overcommit_memory
2 голосов
/ 07 декабря 2010

Не верно.Автоматическое распределение может вызвать переполнение стека, что вызывает мгновенное завершение процесса на большинстве архитектур / платформ, о которых я знаю.

Кроме того, возможно, что программа не может выделить достаточно места для ваших статических переменных с базовой платформыв этом случае программа все равно не будет работать, но она не будет выполнена до вызова main.

0 голосов
/ 07 декабря 2010

Пример:

#include <iostream>

using namespace std;

class A
{
public:
    A() { p = new int[0xFFFFFFFF]; }

private:
    int* p;
};

static A g_a;

int main()
{
    cout << "Why do I never get called?" << endl;
}
0 голосов
/ 07 декабря 2010

Простой контрпример:

#include <string.h>

int main()
{
    int huge[0x1FFFFFFF]; // Specific size doesn't matter;
                          // it just has to be bigger than the stack.

    memset(huge, 0, sizeof(huge) / sizeof(int));

    return 0;
}
...