C ++ проблема с указателями на объекты - PullRequest
1 голос
/ 18 апреля 2010

У меня есть класс с вектором указателей на объекты. Я ввел некоторые элементы в этот вектор, и в своем основном файле мне удалось распечатать их и добавить другие без проблем. Теперь я пытаюсь удалить элемент из этого вектора и проверить, не является ли он NULL, но он не работает.

Я заполняю его по классу Test:

Other *a = new Other(1,1);
Other *b = new Other(2,2);
Other *c = new Other(3,3);

v->push_back(a);
v->push_back(b);
v->push_back(c);

И у меня в главном файле:

Test t;
(...)

Other *pointer = t.vect->at(0);

delete t.vect->at(0);
t.vect->erase(t.vect->begin());

if (pointer == NULL) { cout << "Nothing here.."; } // Never enters here..

Ответы [ 4 ]

4 голосов
/ 18 апреля 2010

Удаление указателя не должно обнулять его, оно просто освобождает память, выделенную там. Использование pointer после удаления не определено, так как память свободна для других целей. Технически спецификация C ++ намеренно оставляет на усмотрение реализаций, хотят ли они обнулить удаленный указатель или нет, но практически никто из тех, о ком я знаю, не делает этого

2 голосов
/ 18 апреля 2010

Удаление памяти, указанной указателем, не устанавливает указатель в NULL.

1 голос
/ 18 апреля 2010

Вы устанавливаете указатель, равный адресу чего-либо, и никогда больше не трогаете его, поэтому, конечно, он не будет нулевым. Тот факт, что вы тогда что-то сделали с объектом, не имеет значения.

Используя простые указатели, не существует безопасного способа для указателя определить, был ли удален объект, на который он когда-то указывал. Самый простой способ сделать то, что вы, кажется, хотите сделать, это оставить его контейнерам: если вы заинтересованы в этом объекте, найдите указатель в векторе, чтобы увидеть, есть ли он еще (и не удаляйте объект без стирание соответствующего элемента из вектора, или у вас снова возникнет та же проблема).

0 голосов
/ 18 апреля 2010

Чтобы преодолеть проблему проверки удаленного ptr, вы можете использовать boost :: shared_ptr .

Вместо удаления используйте .reset() и чтобы проверить, является ли ptr-код действительным, используйте .get()
(На самом деле вы можете просто использовать if(p), где p - это shared_ptr, поскольку он имеет преобразование в bool)

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