Почему при назначении члена возникает исключение NullReferenceException?

Я пытался заставить этот код работать довольно долго и, к сожалению, я всегда получал NullReferenceException, Я обнаружил, что этот код работает, если не использовать указатели на класс, но я не понимаю, почему указатели могут вызывать это исключение. Кстати, я не очень разбираюсь в c ++, поэтому было бы любезно объяснить это простым способом. Заранее спасибо.

class Box
{
public: char* data;
};
int Main()
{
Box* a;
a->data = "Hello World";
return 0;
}

1

Решение

Box* a; объявляет указатель к Box объект. Ты никогда Создайте Box объект так a ни на что не указывает.

Поведение письма a->data следовательно является не определено.

Либо перетащите указатель, чтобы вы получили Box a;или используйте Box* a = new Box();, В последнем случае не забудьте позвонить delete a; в какой-то момент вы потеряете память.

Наконец, написание a->data = "Hello World"; может быть проблематично: a->data будет указателем на только для чтения строковый литерал; поведение при попытке изменить содержимое этого буфера не определено.

Гораздо лучше использовать std::string как тип для a,

2

Другие решения

Указатель просто указывает на (надеюсь) выделенный фрагмент памяти. В вашем примере указатель неинициализирован, и поэтому вы пытаетесь установить память, к которой у вас нет доступа.

Вы должны убедиться, что он указывает на что-то действительное, например:

int Main()
{
Box box; // stack allocation
Box* a = &box; // you could also call new Box; here
a->data = "Hello World";
return 0;
}
1

Значение a не определено, потому что вы никогда не устанавливаете его на что-либо. Поэтому все может случиться. Скорее всего, вы обращаетесь к не принадлежащей вам памяти, вызывая ошибку сегментации или подобное исключение доступа. Это то, что произошло.

Не делай этого. Определите свой адрес в терминах адреса переменной того же типа, который уже определен.

1

указатель к Box объект не Box объект. Указатель Box* a указывает на несуществующий объект, поэтому вы получаете сообщение об ошибке, когда пытаетесь назначить «Hello World» члену.

Вы должны создать Box объект либо путем создания его «в стеке» с продолжительность автоматического хранения:

Box a;

или создав его «в кучу» с продолжительность динамического хранения:

Box* a = new Box;

и удалите его после использования:

delete a;
1

a не инициализирован (или не назначен), это просто повисший указатель. Любое разыменование на нем будет Неопределенное поведение.

Вы могли бы Box* a = new Box, или же Box b; Box* a = &b сделать указатель действительным. например

Box* a = new Box;
a->data = "Hello World";
...
delete a;
0
По вопросам рекламы [email protected]