C'or в классе C ++ - PullRequest
       31

C'or в классе C ++

1 голос
/ 03 апреля 2012

Могу ли я объявить новые переменные, как один из другого класса, в c'or? Предположим, у меня есть класс с именем List и Node (вложенный в класс List), тогда я хочу сделать:

List::List(int num)
{
Node Nod(num); //creating a new Node which is holding num
List_Head=&Nod; //List_Head is a Node pointer variable of List class
}

Как только я это сделаю, я получаю следующее Ошибка выполнения :

Ошибка отладочного подтверждения!

Выражение: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)

Любая помощь?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Область действия и время жизни Nod, которое вы создаете, ограничено конструктором List::List(), поскольку это локальный / автоматический объект.

Как только конструктор возвращает Nod, он не существует, и все, что указывает на него (List_Head), является висящим указателем, его отсылка может вызвать Неопределенное поведение и, скорее всего, сбой.

Вы должны создать Node в динамической памяти (куче), вызвав new, если хотите сослаться за пределы тела конструктора.

List_Head = new Node(num);

в идеале, вы должны использовать какой-нибудь умный указатель 1017 * вместо необработанного указателя для List_Head, чтобы вам не пришлось вручную управлять памятью. Если вы не можете позвонить:

delete List_Head;

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

0 голосов
/ 03 апреля 2012

Вы не можете так делать.Nod выходит из области видимости в конце конструктора (последний }), что означает, что его память становится недействительной, что означает, что List_Head указывает на недопустимую память.

Если вы хотитечтобы сохранить память, вы должны использовать new, например

List_Head = new Node(num);

Просто убедитесь, что delete то, что вы new!Но вы должны быть осторожны с этим!Память может просочиться, если вы не удалите ее, или она может быть удалена дважды, если вы неправильно ее обработаете.В частности, вы должны быть уверены, что также реализовали деструктор, конструктор копирования и оператор присваивания для правильной обработки выделенной памяти.

В качестве альтернативы, вы можете использовать умные указатели (такие как std::shared_ptr, если выиспользуя C ++ 11), чтобы обработать удаление для вас, чтобы вы не теряли память и не удаляли память дважды.Возможно, вам все равно придется определить конструктор копирования и оператор присваивания, в зависимости от того, как вы хотите, чтобы ваш класс действовал (потому что без пользовательских версий этих версий вы получите поверхностную копию объекта вместо глубокая копия , что может быть не тем, что вы хотите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...