Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 24.09.2019
Сообщений: 12

Не вызывается деструктор объекта, под который динамически выделили память в функции

01.03.2020, 20:02. Показов 695. Ответов 8

Студворк — интернет-сервис помощи студентам
Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
class A
{
  public:
    A()
    {
      this->ptr = new int;
      std::cout << "A::A()" << std::endl;
    }
    ~A()
    {
      delete this->ptr;
      std::cout << "A::~A()" << std::endl;
    }
    A(const A& obj)
    {
      this->ptr = obj.ptr;
      std::cout << "A::A(copy)" << std::endl;
    };
 
  private:
    int* ptr;
};
 
A* foo()
{
  A* buffer = new A;
  return buffer;
}
 
void boo(A* obj)
{
  // ...
}
 
int main()
{
  boo(foo());
 
  return 0;
}


Вывод:
Кликните здесь для просмотра всего текста
A::A()


1. Почему не вызывается деструктор?
2. Происходит ли утечка памяти?
3. Если утечка происходит, как её избежать средствами языка, не прибегая к shared_ptr и т.д.?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2020, 20:02
Ответы с готовыми решениями:

При динамическом создании объекта в классе деструктор не вызывается
Добрый день еще раз. Помогите заполнить пробелы в ООП) Есть три класса: // Вспомогательный класс class Object { public: ...

Почему при помещении объекта в list вызывается конструктор и деструктор?
Нужна помощь опытного программиста. Не могу понять почему при помещение объекта в list вызывается конструктор и деструктор. #include...

Ругается на деструктор (выделял динамически память). Почему?
Вот код: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; class MClass { private: int...

8
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.03.2020, 20:42
Цитата Сообщение от ellomy Посмотреть сообщение
1. Почему не вызывается деструктор?
потому что нет delete
Цитата Сообщение от ellomy Посмотреть сообщение
2. Происходит ли утечка памяти?
да
Цитата Сообщение от ellomy Посмотреть сообщение
3. Если утечка происходит, как её избежать средствами языка, не прибегая к shared_ptr и т.д.?
Придерживаться идиомы RAII и не забывать про delete
0
92 / 65 / 27
Регистрация: 23.01.2020
Сообщений: 156
01.03.2020, 20:49
Я только начал изучать классы поэтому могу пока только предположить, что у вас нет освобождения памяти.
В строку 34 добавьте
C++
1
delete obj;
0
0 / 0 / 0
Регистрация: 24.09.2019
Сообщений: 12
01.03.2020, 20:51  [ТС]
Можете привести пример? Потому что мне не очень понятно, где здесь нужно впихнуть delete, чтобы вызвался деструктор.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
01.03.2020, 20:54
Цитата Сообщение от ellomy Посмотреть сообщение
Потому что мне не очень понятно, где здесь нужно впихнуть delete, чтобы вызвался деструктор.
delete делается не для того, "чтобы вызвался деструктор", а для того, чтобы уничтожить динамически созданный объект. Вызов деструктора - лишь часть этого процесса.

А где это нужно делать - это уже у вас нужно спрашивать. delete вы будете делать тогда, когда вам объект больше не нужен. Это только вам известно.
0
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
01.03.2020, 21:04
ellomy, может так
C++
1
2
3
4
5
6
7
8
9
A::~A()
{
if(this->ptr!=nullptr)
{
delete this->ptr;
ptr=nullptr;
}
 
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
01.03.2020, 21:08
Цитата Сообщение от _-_VLADoS_-_ Посмотреть сообщение
ellomy, может так
C++
1
2
3
4
5
6
7
8
A::~A()
{
if(this->ptr!=nullptr)
{
delete this->ptr;
ptr=nullptr;
}
}
Во-первых, это бессмысленное исправление. Зачем вы это сделали?

Во-вторых, вопрос-то совсем не об этом.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.03.2020, 21:13
Цитата Сообщение от ellomy Посмотреть сообщение
void boo(A* obj)
{
  // ...
}

C++
1
2
3
4
void boo(A* obj)
{
  delete obj;
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.03.2020, 21:20
Кстати:
Цитата Сообщение от ellomy Посмотреть сообщение
C++
1
2
3
4
5
    A(const A& obj)
    {
      this->ptr = obj.ptr; // <-- вот так копировать точно не надо, если время жизни ресурса управляется обектом
      std::cout << "A::A(copy)" << std::endl;
    };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2020, 21:20
Помогаю со студенческими работами здесь

Деструктор вызывается до то возвращения значения из функции
hi hi::operator+(const hi&amp; in) { struc * cur = last; struc *curs = in.last; hi out(&quot;0&quot;); int ost = 0, i = cur-&gt;a + curs-&gt;a...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса?
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

Динамически выделить память под массив
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection { public: pk *field; ...

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный элемент главной и побочной диагоналей с...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru