Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
-27 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 609
1

Когда надо удалять объект

07.12.2019, 18:58. Показов 1182. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если объект создаётся по ссылке оператором new, его надо удалять. А если он создаётся внутри функции и возвращается как её аргумент, в другой функции, в которой он становится переменной, тоже обязательно удалять самому?
Пример.
C++
1
2
3
4
5
6
7
Point* func(){
   return Point p = new Point();
}
 
void func2(){
   Point p = *func();
}
Вот во второй функции func2, надо делать delete *p?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2019, 18:58
Ответы с готовыми решениями:

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию?
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по...

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

Динамический объект не содержит в себе линамических членов. Удалять ли его?
Собственно в теме весь вопрос) Непонятно, нужно ли вызывать delete для динамического объекта если...

Как удалить массив, созданный в динамической памяти? Или не надо его удалять?
#include <iostream> #include<iomanip> #include <fstream> #include <string> #include <cstdio>...

9
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,806
07.12.2019, 19:00 2
Когда не нужен больше объект, лежащий по этому адресу - тогда и удалять его.
0
-27 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 609
07.12.2019, 19:04  [ТС] 3
Когда нужен объект, лежащий по этому адресу - тогда не удалять его.

Вы несомненно правы, но, если Вопрос был немного не в этом.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.12.2019, 19:10 4
Цитата Сообщение от _20_ Посмотреть сообщение
Point p = *func();
У вас тут память уже утекла.

Надо так:
C++
1
2
3
4
5
6
7
Point* func(){
   return new Point();
}
 
void func2(){
   Point * p = func();
}
Тогда да. Во второй функции надо делать
C++
1
delete p;
1
-27 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 609
07.12.2019, 19:15  [ТС] 5
А если мне будет удобнее иметь всё - таки объект, а не ссылку, надо ли его удалять?

C++
1
2
3
4
5
6
7
Point* func(){
   return new Point();
}
 
void func2(){
   Point p = *func();
}
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.12.2019, 19:51 6
Цитата Сообщение от _20_ Посмотреть сообщение
А если мне будет удобнее иметь всё - таки объект, а не ссылку, надо ли его удалять?
Именно в таком варианте у вас утечка памяти.

По-нормальному, если нужен объект - делайте так:
C++
1
2
3
4
5
6
7
Point func(){
   return Point();
}
 
void func2(){
   Point p = func();
}
Тогда удалять ничего не надо.

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Именно в таком варианте у вас утечка памяти.
Т.е., я имею в виду, что что-то удалять уже поздно, вы уже потеряли объект. Ничего удалить в этом коде уже нельзя, а утечка памяти уже свершилась.
1
-27 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 609
09.12.2019, 21:48  [ТС] 7
Спасибо. Ещё хотел бы одну вещь спросить, если есть цикл:
C++
1
2
3
4
5
Int* n;
for (int i = 0; i < 6; ++i){
   n = func();
}
delete n;
Происходит ли утечка памяти? Надо ли внести
C++
1
delete n;
в цикл?
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
09.12.2019, 22:01 8
Цитата Сообщение от _20_ Посмотреть сообщение
Происходит ли утечка памяти? Надо ли внести
C++Выделить код
1
delete n;
в цикл?
надо конечно.

Добавлено через 59 секунд
n не перезаписывает объект, а меняет ячейку на которую указывает, можно проверить
C++
1
std::cout << &(*n);
1
-27 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 609
10.12.2019, 03:33  [ТС] 9
а есть ли способ, чтобы не писать дополнительную строчку, а объект перезаписывался по ссылке?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
10.12.2019, 09:25 10
_20_,
C++
1
2
3
4
    std::unique_ptr<Int> n;
    for (int i = 0; i < 6; ++i) {
       n = func();
    }
func должна возвращать std::unique_ptr<Int>.

Или так, если func возвращает Int *
C++
1
2
3
4
    std::unique_ptr<Int> n;
    for (int i = 0; i < 6; ++i) {
       n.reset( func() );
    }
0
10.12.2019, 09:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2019, 09:25
Помогаю со студенческими работами здесь

Объект умирает когда не должен
Пытаюсь сделать функцию, которая бы возвращала созданый ею объект (src), но он почему - то...

Удаляется объект когда не требуется и всё равно продолжает существовать
Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем...

Указатели и ссылки. Надо ли обнулять? когда и как это делать?
насчет ссылок вроде все ясно. обнулять их нет смысла на сколько я понимаю. А вот насчет указателей...

Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?
Ребята, если вникать, то вообще ничё непонятно. Вот смотрите: пусть у нас есть абстрактный класс...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru