С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583

Создание/удаление объектов

25.02.2018, 12:25. Показов 5776. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. На сколько мне известно есть 2 способа создания объекта - с помощью слова new и без него. Если верить Брюсу Экелю чтобы удалить объект из динамической (оперативной) памяти нужно вызвать delete данного объекта, который был создан с помощью ключевого слова new, в результате чего вызывается деструктор и типа все данные связанные с объектом будут стерты (а без new (Myclassn mn(5); ) - delete не работает - среда ругается и деструктор такого типа объекта вызывается даже не после фигурной скобки, а вообще при закрытие приложения - поправьте если не так ). Почему тогда после этого слова delete у объекта, который мы типа удалили, все еще есть доступ к методам/переменным?
C++
1
2
3
4
5
6
7
8
  int testcolectn;  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Myclassn *mn=new Myclassn(testcolectn);
delete mn;
// и даже после этого я могу вызвать переменные этого объекта
Edit1->Text=mn->bgn;
}
Не подскажите как удалить все, что связанно с данным объектом, это возможно, или при динамическом создание/удаление объектов этот мусор неизбежно остается?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2018, 12:25
Ответы с готовыми решениями:

Создание и удаление объектов
Люди, прошу прошения за тупой вопрос, но что-то в гугле сходу не нашел. Вот, допустим, есть класс реализующий простенькую очередь. ...

Создание/удаление объектов класса
Имеется следующий код: cow.h #ifndef COW_H #define COW_H class Cow { private: char name; char * hobby;

Добавление и удаление объектов. Рисование объектов на экране
Доброго времени суток. Есть очень интересующий вопрос, как сделать добавление, обновление, удаление объектов? Допустим есть класс...

13
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.02.2018, 12:49
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
// и даже после этого я могу вызвать переменные этого объекта
Edit1->Text=mn->bgn;
только объекта уже нет.
и такое обращение - незаконное.

Добавлено через 1 минуту
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
этот мусор неизбежно остается?
память помечается как свободная.
и в любой момент времени может быть выделена для другого объекта.

обращаясь к данным по невалидному адресу,
вы лезете уже в чужую память.
последствия могут быть не предсказуемы)
0
25.02.2018, 12:51

Не по теме:

Вплоть до нарушения пространственно-временного континуума

0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
25.02.2018, 16:21  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
только объекта уже нет.
и такое обращение - незаконное.
Если его нет, то почему текстовое поле Edit1->Text выводит значение присвоенное его полю int bgn? Например если bgn присвоить 5, удалить объект а потом вывести значение mn->bgn , то оно будет равно 5 -
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Myclassn *mn=new Myclassn();
mn->bgn=5;// присваиваем 5 
delete mn;//объект mn убит, а значит в следующей строке должна быть ошибка
Edit1->Text=mn->bgn;// но ошибки нет - печатает "5"
}
п.с.
на java в таком случае сразу выскакивает NPE, только там не delete а "}"
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.02.2018, 16:23
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Если его нет, то почему текстовое поле Edit1->Text выводит значение присвоенное его полю int bgn?
Цитата Сообщение от hoggy Посмотреть сообщение
память помечается как свободная.
и в любой момент времени может быть выделена для другого объекта.
вам не повезло.
и сдохший кусок памяти ещё не успел протухнуть.
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
25.02.2018, 16:27  [ТС]
точнее mn=null;на java. Остается вам на слово поверить, а как то это можно проверить?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.02.2018, 16:29
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Почему тогда после этого слова delete у объекта, который мы типа удалили, все еще есть доступ к методам/переменным?
Примерно по тем же причинам, по которым у уволенного человека есть доступ к буфет - по документам человека уже уволили, а по факту он еще околачивается в здании. Но попытка поймать уволенного Иванова и послать за бутербродом все равно порождает неопределенное поведение.
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
на java в таком случае сразу выскакивает NPE
А Джава после увольнения Иванова, еще и убеждается что его выставили за дверь.
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
25.02.2018, 16:39  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
вам не повезло.
и сдохший кусок памяти ещё не успел протухнуть.
А когда он протухнет, если не секрет, это можно как то определить?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.02.2018, 16:40
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
А когда он протухнет, если не секрет, это можно как то определить?
об этом знают лишь далекие холодные звезды.
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
25.02.2018, 16:50
nnnikotinnn995, протухнет, когда в это место попадут другие данные. Память не очищается, а лишь объявляется свободной для записи
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.02.2018, 17:29
nnnikotinnn995, так может и стоило на java оставаться?
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
27.02.2018, 08:18  [ТС]
А что будет происходить с объектом, если его не создавать с помощью new и не удалять , а только другое значение ему присваивать, например
C++
1
2
3
4
5
6
7
int n=0;
while (true){
AnsiString valuebefon="";
n++;
//valuebefon=null; нужно ли так делать чтоб сэкономить память?
 valuebefon="begin"+n;
}
Будет ли где то накапливаться мусор от valuebefon?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.02.2018, 08:44
nnnikotinnn995,
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
int n=0;
while (true){
AnsiString valuebefon="";
n++;
//valuebefon=null; нужно ли так делать чтоб сэкономить память?
*valuebefon="begin"+n;
}
здесь у тебя при каждой итерации цикла будет создаваться новый объект на стеке, скорее всего по одному и тому же адресу при каждой итерации. соответственно память будет перезаписываться, и мусор накапливаться не будет. даже если запись будет по разным адресам, при очередной итерации стековая память будет обновлена а все что было создано при прошлой итерации станет свободной для других итераций. почитай про аппаратный стек. стек и куча.

Добавлено через 7 минут
nnnikotinnn995, если проще, то есть такое понятие как зона видимости. если объект создается без оператора new внутри блока, то он автоматически уничтожается при выходе из этого блока и оператор delete использовать не нужно.
1
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
12.03.2018, 10:30  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
nnnikotinnn995, если проще, то есть такое понятие как зона видимости. если объект создается без оператора new внутри блока, то он автоматически уничтожается при выходе из этого блока и оператор delete использовать не нужно.
Спасибо, по сути так же как в java, только там даже с new не нужно вызывать delete (точнее его вообще нет), }- убивает все что видно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2018, 10:30
Помогаю со студенческими работами здесь

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со своей библиотекой, которая включает в себя...

Удаление объектов(деструкторы)
Можете нормально объяснить как пользоваться деструкторами. Допустим мне нужно удалить созданный объект в классе, КАК????????

Ненужное удаление объектов
В классе есть метод, в котором при определенных условиях создаются объекты и помещаются в список, так вот как сделать так чтобы объекты...

Удаление объектов GDI
Почему нужно удалять созданные (например так: hRgn = CreateRectRgn(0, 0, 0, 0); ) объекты GDI? ну то есть зачем их удалять явно?...

Удаление объектов класса
Никак не могу понять, как правильно освободить память. Подскажите пожалуйста в чем ошибка. #include "Head.h" int min(int a,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru