std :: array матрица вызывает EXC_BAD_ACCESS как локальную переменную; как глобальная переменная. Зачем? [Дубликат]

Другим случаем, когда NullReferenceExceptions может случиться, является (неправильное) использование оператора as :

class Book {
    public string Name { get; set; }
}
class Car { }

Car mycar = new Car();
Book mybook = mycar as Book;   // Incompatible conversion --> mybook = null

Console.WriteLine(mybook.Name);   // NullReferenceException

Здесь Book и Car являются несовместимыми типами; a Car не может быть преобразован / передан в Book. Когда этот сбой завершается неудачно, as возвращает null. Используя mybook после этого, вы вызываете NullReferenceException.

В общем случае вы должны использовать cast или as, как показано ниже:

Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:

ComicBook cb = (ComicBook)specificBook;

Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as:

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}

84
задан sth 4 December 2009 в 16:43
поделиться

5 ответов

Вероятно, вы просто получаете переполнение стека. Массив слишком велик, чтобы вставлять адресное пространство стека вашей программы.

Если вы выделяете массив в куче, вы должны быть в порядке, если у вас достаточно памяти.

int* array = new int[1000000];

Но помните, что это потребует от вас delete[] массива. Лучшим решением было бы использовать std::vector<int> и изменить его размер до 1000000 элементов.

98
ответ дан Charles Salvia 5 September 2018 в 07:34
поделиться

В C или C ++ локальные объекты обычно выделяются в стеке. Вы выделяете большой массив в стеке, больше, чем может обрабатывать стек, поэтому вы получаете stackoverflow.

Не выделяйте его локально в стеке, используйте некоторые другие вместо этого. Этого можно достичь либо путем создания объекта global , либо выделения его в глобальной куче . Глобальные переменные прекрасны, если вы не используете их из любой другой единицы компиляции. Чтобы убедиться, что это не происходит случайно, добавьте спецификатор статического хранилища, иначе просто используйте кучу.

Это будет выделяться в сегменте BSS, который является частью кучи:

static int c[1000000];
int main()
{
   cout << "done\n";
   return 0;
}

Это будет выделяться в сегменте DATA, который также является частью кучи:

int c[1000000] = {};
int main()
{
   cout << "done\n";
   return 0;
}

Это будет выделяться в каком-то неуказанном месте в куче:

int main()
{
   int* c = new int[1000000];
   cout << "done\n";
   return 0;
}
46
ответ дан Community 5 September 2018 в 07:34
поделиться

Поскольку вы храните массив в стеке. Вы должны хранить его в куче. См. эту ссылку , чтобы понять концепцию кучи и стека.

2
ответ дан evotopid 5 September 2018 в 07:34
поделиться

Ваш массив выделяется в стеке, в этом случае попытайтесь выделить массив того же размера с помощью alloc.

2
ответ дан rerun 5 September 2018 в 07:34
поделиться

Кроме того, если вы работаете в большинстве UNIX & amp; Linux, вы можете временно увеличить размер стека с помощью следующей команды:

ulimit -s unlimited

Но будьте осторожны, память - это ограниченный ресурс и с большой силой приходят большие обязанности:)

7
ответ дан Usman.3D 5 September 2018 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: