0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119

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

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

Author24 — интернет-сервис помощи студентам
Конечно тема избитая, и я находил много решений, но проверить удаляються ли объекты не могу.
Есть массив указателей на объекты
C++
1
Record *rec[10];
Класс People наследник Record.
В программе создаются объекты и указатели присваиваются элементам массива
C++
1
rec[i] = new People();
Вопрос: как удалить объекты в конце программы? Или вообще надо не так хранить указатели?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2010, 22:55
Ответы с готовыми решениями:

Удаление объекта по указателю
Как удалить объект по shared_ptr? с обычным можно было free(ptr), а тут не понятно. И как присвоить shared_ptr значение nullptr? ...

Как правильно организовать "мягкое удаление" ?
Извиняюсь за такой вопрос, но лотусу не учился и хотелось бы знать типовое решение. Надо сделать что бы документы не удалялись из базы, а...

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

13
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.10.2010, 23:04
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;
  }
}
2
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.10.2010, 23:40
AlexRyzhenko, есть мнение, что лучше пользоваться умными указателями.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
05.10.2010, 15:15
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
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
05.10.2010, 17:48  [ТС]
Если в классе 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
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.10.2010, 18:02
AlexRyzhenko, все дело в том, что если ты передаешь объект по указателю, ты не можешь менять сам указатель, ты можешь менять только объект, на который он указывает. Поэтому, чтобы изменить сам указатель (т.е. освободить память, выделенную указателю), нужно передавать адрес указателя (как у тебя второй способ - Record **rec), либо ссылку на указатель (Record *&rec)
1
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
27.06.2017, 20:13
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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.06.2017, 22:28
NSXfl,
Ну и древнюю тему вы подняли.
Указатель - переменная которая содержит адрес обьекта (говоря абстрактно) в памяти
В вашем случае время жизни переменной p ограничено временем жизни тела цикла for (на каждую итерацию - свой указатель)
0
Любитель чаепитий
 Аватар для GbaLog-
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,018
Записей в блоге: 1
28.06.2017, 05:46
Цитата Сообщение от NSXfl Посмотреть сообщение
подскажите, указатель * p при этом удаляется?
указатель - нет, но то, что находится по адресу, содержащемуся в указателе - да.
0
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
28.06.2017, 20:22
GbaLog-, Undisputed, то есть указатель * p не нужно тут удалять, главное что память что занимала переменная мы обозначили на возможность перезаписи?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
28.06.2017, 21:30
NSXfl,
А что вы понимаете под удалением указателя и как оно выглядит?
Освободили память по адресу и все, а переменная сама уничтожится при завершении тела цикла
0
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
28.06.2017, 22:12
Undisputed, Ну занулить его, удалить нули, свап..
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.06.2017, 22:29
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
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.06.2017, 22:57
NSXfl,
Синим отмечена занятая память на стеке;
Оранжевым -- занятая память в куче;
Желтым -- память, которую мы выделяем;
Серым -- свободная ( незанятая ) память.
Стрелочка -- куда указывает указатель.

Не по теме:

Не ругайте :D

Миниатюры
Как правильно организовать удаление объекта по указателю?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2017, 22:57
Помогаю со студенческими работами здесь

Как правильно обратиться к объекту формы по текстовому указателю на его Name
Ребята. Если неграмотно выражаюсь - не судите. Есть форма для ввода данных: тыща текстбоксов с сопутствующими им питсотами лабелами ...

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

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

[Нужна критика] Как правильно копировать объект-потомок по ссылке\указателю на родителя? + Пара мелких уточнений
Захотелось провести эксперимент и создать функцию для работы с обёрткой массива на стеке. Функция должна работать как с прямыми, так и с...

Привязка объекта к указателю
День добрый господа, у меня такой вопрос, как можно привязать объект к указателю? например на сцене есть несколько объектов, я хочу по...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Согласованность транзакций в MongoDB
Codd 30.04.2025
MongoDB, начинавшая свой путь как классическая NoSQL система с акцентом на гибкость и масштабируемость, сильно спрогрессировала, включив в свой арсенал поддержку транзакционной согласованности. Это. . .
Продвинутый ввод-вывод в Java: NIO, NIO.2 и асинхронный I/O
Javaican 30.04.2025
Когда речь заходит о вводе-выводе в Java, классический пакет java. io долгие годы был единственным вариантом для разработчиков, но его ограничения становились всё очевиднее с ростом требований к. . .
Обнаружение объектов в реальном времени на Python с YOLO и OpenCV
AI_Generated 29.04.2025
Компьютерное зрение — одна из самых динамично развивающихся областей искусственного интеллекта. В нашем мире, где визуальная информация стала доминирующим способом коммуникации, способность машин. . .
Эффективные парсеры и токенизаторы строк на C#
UnmanagedCoder 29.04.2025
Обработка текстовых данных — частая задача в программировании, с которой сталкивается почти каждый разработчик. Парсеры и токенизаторы составляют основу множества современных приложений: от. . .
C++ в XXI веке - Эволюция языка и взгляд Бьярне Страуструпа
bytestream 29.04.2025
C++ существует уже более 45 лет с момента его первоначальной концепции. Как и было задумано, он эволюционировал, отвечая на новые вызовы, но многие разработчики продолжают использовать C++ так, будто. . .
Слабые указатели в Go: управление памятью и предотвращение утечек ресурсов
golander 29.04.2025
Управление памятью — один из краеугольных камней разработки высоконагруженных приложений. Го (Go) занимает уникальную нишу в этом вопросе, предоставляя разработчикам автоматическое управление памятью. . .
Разработка кастомных расширений для компилятора C++
NullReferenced 29.04.2025
Создание кастомных расширений для компиляторов C++ — инструмент оптимизации кода, внедрения новых языковых функций и автоматизации задач. Многие разработчики недооценивают гибкость современных. . .
Гайд по обработке исключений в C#
stackOverflow 29.04.2025
Разработка надёжного программного обеспечения невозможна без грамотной обработки исключительных ситуаций. Любая программа, независимо от её размера и сложности, может столкнуться с непредвиденными. . .
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru