Ошибка: нулевая разыменование - PullRequest
4 голосов
/ 07 июля 2010

Этот код:

int main(char[][] args)
{
  MyObject obj;
  obj.x;
  return 0;
}

дает мне: Error: null dereference in function _Dmain когда я компилирую его с флагом -O (на dmd2) Почему? obj не выделяется в стеке? Должен ли я всегда использовать new для создания объектов?

Ответы [ 2 ]

8 голосов
/ 07 июля 2010

Сводка : у вас есть новые объекты.Всегда.

Классы D ближе к C # или Java, чем к C ++.В частности, объекты всегда являются всегда ссылочными значениями.

MyObject, под капотом, является указателем на фактический объект.Таким образом, когда вы используете MyObject obj;, вы создаете указатель null и фактически не создаете объект.Объект должен быть создан с помощью оператора new:

auto obj = new Object();

Это создает объект в куче.

Вы не можете напрямую создавать объекты в стеке в D. Лучшее, что вы можете сделатьвыглядит примерно так:

scope obj = new MyObject;

Компилятор позволяет помещать объект в стек, но не обязан.

(На самом деле, я подозреваю,это может исчезнуть в будущей версии D2.)

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

int main(string[] args)
{
    ...
}

char[] и string имеют одинаковую физическую структуру, но означают немного разные вещи;в частности, string - это просто псевдоним для immutable(char)[], поэтому, используя char[], вы обойдете защиту системы const.

0 голосов
/ 07 июля 2010

Я не очень хорошо читаю ваш код, так как я парень из VB, но похоже, что вы инициируете объект без значения.

Вы создаете объект с именем obj Вы называете obj.x тогда вы возвращаете «0» (ноль)

что именно ты делаешь? Я почти уверен, что obj должен быть НОВЫМ, и вам нужно возвращать что-то кроме физического "0"

...