Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.
Например:
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.
По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит
Дополнительная информация находится в C # NullReferenceException и Null Parameter .
1- Если вы работаете на 32-битной машине, у вас не может быть переменной с более чем 2 ГБ, выделенной для нее.
2- Если вы работаете на 64-битной машине, вы может выделять столько, сколько RAM + Swap-память в целом, однако для выделения всего для одной переменной требуется большой последовательный фрагмент памяти, который может быть недоступен. Попробуйте со связанным списком, где каждый элемент имеет только 1 МБ, и вы можете достичь высшей памяти, выделенной в общей сложности.
3- Как уже отмечалось вами и Шартом, если вы не используете свою память, Linux выиграл 't выделить его.
Некоторые примечания:
Ваш цикл for
в вашем примере кода на самом деле касается 1 ГБ памяти, так как он индексирует 128 * 1024 * 1024 long long
s, а каждый long long
равен 8 байтам.
Ваш # 2 терпит неудачу с segfault либо потому, что sizeof(long long int) > 8
, либо потому, что ваш malloc возвратил NULL. Это очень возможно, если вы запрашиваете 1 ГБ ОЗУ.
Подробнее о № 2. Из вашего комментария 128 МБ я понимаю, что вы не можете понять, что происходит. Поскольку вы объявляете указатель массива как long long int
, размер каждого элемента массива равен 8 байтам. 1024/8 == 128, поэтому ваш цикл работает. Так или иначе, когда я это пробовал.