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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.78
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
#1

Как правильно организовать удаление объекта по указателю? - C++

04.10.2010, 22:55. Просмотров 3295. Ответов 13
Метки нет (Все метки)

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

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

Нюансы синтаксиса: как правильно обращаться к полям класса по указателю? - C++
Всем привет, пытаюсь сделать указатель на свой класс: int main() { hmn testobj1; test_class_change(&testobj1); ...

Передача объекта по указателю в функцию - C++
Здравствуйте. При передаче объекта в метод другого объекта по указателю, метод получает непонятно что. class SomeObj { ...

Список: Как организовать перемещение объекта по списку? - C++
Работаю с двухсвязным списком и при сортировке, когда объекты в списке меняются местами нужно же передавать всё по ссылке, верно? Не...

Создание объекта произвольного класса по указателю на базовый класс - C++
Есть некий абстрактный базовый класс . Мы знаем , что от этого базового класса будет образовано несколько конкретных производных классов...

Как правильно организовать дерево ? - C++
Есть класс дерева (упрощенный вариант) class Tree { public: Tree * parent; int data; vector<Tree> childs; }

13
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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;
  }
}
1
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.10.2010, 23:40 #3
AlexRyzhenko, есть мнение, что лучше пользоваться умными указателями.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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;  //освобождаем указатель, если его копия хранится еще где-либо в другом месте
                        //объект не будет уничтожен
  }
}
0
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. Не понимаю механизма. Объясните, пожалуйста.
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
05.10.2010, 18:02 #6
AlexRyzhenko, все дело в том, что если ты передаешь объект по указателю, ты не можешь менять сам указатель, ты можешь менять только объект, на который он указывает. Поэтому, чтобы изменить сам указатель (т.е. освободить память, выделенную указателю), нужно передавать адрес указателя (как у тебя второй способ - Record **rec), либо ссылку на указатель (Record *&rec)
1
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
27.06.2017, 20:13 #7
C++
1
2
3
4
5
6
7
8
for (std::vector<Global*>::iterator it = Global::X.begin() ; it!=Global::X.end() ; ++it)
       {
 
Global * p = *it;
*it = 0;
delete p;
 
}
подскажите, указатель * p при этом удаляется?
0
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
27.06.2017, 22:28 #8
NSXfl,
Ну и древнюю тему вы подняли.
Указатель - переменная которая содержит адрес обьекта (говоря абстрактно) в памяти
В вашем случае время жизни переменной p ограничено временем жизни тела цикла for (на каждую итерацию - свой указатель)
0
GbaLog-
Любитель чаепитий
2898 / 1354 / 333
Регистрация: 24.08.2014
Сообщений: 4,788
Записей в блоге: 1
Завершенные тесты: 2
28.06.2017, 05:46 #9
Цитата Сообщение от NSXfl Посмотреть сообщение
подскажите, указатель * p при этом удаляется?
указатель - нет, но то, что находится по адресу, содержащемуся в указателе - да.
0
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
28.06.2017, 20:22 #10
GbaLog-, Undisputed, то есть указатель * p не нужно тут удалять, главное что память что занимала переменная мы обозначили на возможность перезаписи?
0
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
28.06.2017, 21:30 #11
NSXfl,
А что вы понимаете под удалением указателя и как оно выглядит?
Освободили память по адресу и все, а переменная сама уничтожится при завершении тела цикла
0
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
28.06.2017, 22:12 #12
Undisputed, Ну занулить его, удалить нули, свап..
0
Captain Maxee
Велосипедист...
233 / 155 / 34
Регистрация: 15.12.2015
Сообщений: 562
28.06.2017, 22:29 #13
NSXfl, T -- type ( какой-то тип данных )
C++
1
2
3
4
5
6
7
8
9
10
11
{
    T* pointer;  // Создали переменную-указатель на стеке
 
    ...
 
    pointer = new T;  // Проинициализировали указатель адресом, который вернула команда <new T> из heap ( куча )
 
    ...
 
    delete pointer;  // Освободили блок памяти, на который указывал указатель
}  // После этой скобки, pointer "удалился"
0
Captain Maxee
Велосипедист...
233 / 155 / 34
Регистрация: 15.12.2015
Сообщений: 562
28.06.2017, 22:57 #14
NSXfl,
Синим отмечена занятая память на стеке;
Оранжевым -- занятая память в куче;
Желтым -- память, которую мы выделяем;
Серым -- свободная ( незанятая ) память.
Стрелочка -- куда указывает указатель.

Не по теме:

Не ругайте

0
Миниатюры
Как правильно организовать удаление объекта по указателю?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2017, 22:57
Привет! Вот еще темы с ответами:

Удаление строки по указателю - C++
Прошу прощения за столь глупый вопрос: как удалить строку по указателю. Т.е. char *s = new char; strcpy( s, &quot;blablabla&quot; ); ... ...

Как правильно организовать ветвление в программе? (if / else if) - C++
Доброгл времени суток. Есть вопрос - почему если я ввожу нужный мне параметр мне всплывает на экран &quot;Введите значение средств в гривнях...

Как правильно организовать большой проект? - C++
В будущем хочу участвовать в разработке игр - начал изучать С++, вопрос тут такой, как правильно организовать структуру достаточно большого...

Как правильно организовать многофайловый проект? - C++
Добрый вечер дорогой форум. Сразу скажу я новичек. Пишу курсовик, сроки, как всегда поджимают (семья, ремонт и две работы)... Но это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
28.06.2017, 22:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru