Форум программистов, компьютерный форум CyberForum.ru

Удаление объекта по указателю. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.78
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
04.10.2010, 22:55     Удаление объекта по указателю. #1
Конечно тема избитая, и я находил много решений, но проверить удаляються ли объекты не могу.
Есть массив указателей на объекты
C++
1
Record *rec[10];
Класс People наследник Record.
В программе создаются объекты и указатели присваиваются элементам массива
C++
1
rec[i] = new People();
Вопрос: как удалить объекты в конце программы? Или вообще надо не так хранить указатели?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 22:55     Удаление объекта по указателю.
Посмотрите здесь:

C++ Передача объекта по указателю в функцию
C++ создание объекта произвольного класса по указателю на базовый класс
удаление объекта C++
Удаление объекта C++
C++ Удаление объекта класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.10.2010, 23:04     Удаление объекта по указателю. #2
C++
1
2
3
4
5
6
7
8
9
10
11
Record *rec[10];
memset( rec, 0, sizeof(rec) );
....
rec[i] = new People();
....
for( int i=0;i<10;++i ){
  if( rec[i] != NULL ){
    delete rec[i];
    rec[i] = NULL;
  }
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.10.2010, 23:40     Удаление объекта по указателю. #3
AlexRyzhenko, есть мнение, что лучше пользоваться умными указателями.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
05.10.2010, 15:15     Удаление объекта по указателю. #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <boost/shared_ptr>
 
int main(){
  boost::shared_ptr<Record> arr[10];
  ....
  arr[0] = new Record( 1,2 );
  arr[8] = new Record( 4,6 );
  ....
  lpA->fSet( arr[5] ); // передаем указатель в другой класс
  lpB->fSet( arr[1] );
  ....
  for( int i=0;i<10;++i ){
    arr[i] = NULL;  //освобождаем указатель, если его копия хранится еще где-либо в другом месте
                        //объект не будет уничтожен
  }
}
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
05.10.2010, 17:48  [ТС]     Удаление объекта по указателю. #5
Если в классе Record есть метод удаления объекта
C++
1
2
3
4
5
void delete_rec(Record *rec)
{
delete rec;
rec = NULL;
}
Он вызывается через элемент массива укзателей на объекты
C++
1
rec[n]->delete_rec(rec[n]);
Интуитивно понимаю, что лажа, но как иначе? Так вот, в этом случае объект удаляется, но указатель не равен NULL. А если сделать так
C++
1
2
3
4
5
6
7
void delete_rec(Record **rec)
{
delete *rec;
*rec = NULL;
}
...
rec[n]->delete_rec(&rec[n]);
Тогда и объект удаляется, и указатель равен NULL. Не понимаю механизма. Объясните, пожалуйста.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.10.2010, 18:02     Удаление объекта по указателю. #6
AlexRyzhenko, все дело в том, что если ты передаешь объект по указателю, ты не можешь менять сам указатель, ты можешь менять только объект, на который он указывает. Поэтому, чтобы изменить сам указатель (т.е. освободить память, выделенную указателю), нужно передавать адрес указателя (как у тебя второй способ - Record **rec), либо ссылку на указатель (Record *&rec)
Yandex
Объявления
05.10.2010, 18:02     Удаление объекта по указателю.
Ответ Создать тему
Опции темы

Текущее время: 13:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru