Глядя перед прыжком - PullRequest
       7

Глядя перед прыжком

2 голосов
/ 27 ноября 2010

Игнорирование проблем многопоточности, гарантированно сработает следующее:

int can_alloc(size_t i)
{
    void *p = malloc(i);
    if(p == NULL) return 0;
    free(p);
    return 1;
}

// later
if(can_alloc(10))
{
    char *c = malloc(10); // no need to verify, we already did?
    memcpy(c, "something", 10);
}

Это в основном из любопытства.У меня нет планов использовать это для чего-либо, но я считаю, что это должно быть гарантировано, и было бы полезно знать наверняка.

Ответы [ 2 ]

5 голосов
/ 27 ноября 2010

Нет.Даже без многопоточности вызов malloc получает ресурсы (память) из ОС.Обычно (Windows, Linux, Mac и т. Д.) ОС может выполнять действия, которые влияют на доступные ресурсы во время выполнения вашей программы - в любое время.Это означает, что между вашей проверкой и вашим фактическим распределением память может стать «недоступной».

Если у вас есть необычно завершенный контроль ОС, тогда можно было бы сделать это надежным -но это было бы очень сложно.

1 голос
/ 27 ноября 2010

Ответ выше верен. На многих версиях Linux это еще хуже, поскольку он использует оптимистичное распределение памяти. Так что даже если malloc() возвращает ненулевое значение, оно не означает, что память действительно доступна. Подробнее здесь .

...