Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
RAFA91
Заблокирован
#1

Почему не вызывается деструктор? - C++

05.07.2015, 15:21. Просмотров 601. Ответов 18
Метки нет (Все метки)

Всем доброго времени суток!

Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 48?

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
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include<stdio.h>
#include<conio.h>
 
 
using namespace std;
 
class Rafa
 
{
 
private:
 
    int x;
 
public:
 
    Rafa() : x(0) {printf("\nKONSTRUKTOR 1 Rafa %p\n",this);}
 
    Rafa(int a) : x(a) {printf("\nKONSTRUKTOR 2 Rafa %p\n",this);}
 
    ~Rafa()  {printf("\nDESTRUKTOR Rafa %p\n",this);}
 
    int kas() const {printf("\nint kas() %p\n",this); return x;}
};
 
int main()
 
{
    Rafa **A = new Rafa *[5]; //Rafa *A[5]
 
        Rafa *p = 0;
 
    printf("\n**************************)))))))))))))))))\n");
 
    for(int i=0;i<5;i++)
 
    {
        p = new Rafa(i+1);
        
        A[i] = p;
    }
 
        for(i=0;i<5;i++)
 
    printf("\n*********** %d\n",(*A[i]).kas());
 
    delete [] A;
 
    getch();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2015, 15:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему не вызывается деструктор? (C++):

Почему вызывается деструктор?
Доброго времени суток. Написал такой код: struct O { virtual ~O() ...

Объясните почему вызывается деструктор
Вот код char* ConjunctionLots(ArrayLot firstLot, ArrayLot secondLot,...

Почему виртуальный деструктор вызывается дважды?
Непонятно: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;string&gt; ...

Почему деструктор вызывается два раза
Всем привет. Есть код, для примера #include &lt;vector&gt; using namespace std; ...

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

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

18
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
05.07.2015, 15:23 #2
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
delete [] A;
Удалил память выделенную для массива указателей, для объектов не удалил.
Цитата Сообщение от RAFA91 Посмотреть сообщение
for(int i=0;i<5;i++)
{
p = new Rafa(i+1);
A[i] = p;
}
Выделяем мы ее в цикле, а удаляем почему-то по-другому.
1
RAFA91
Заблокирован
05.07.2015, 18:12  [ТС] #3
при удалении массива указателей
C++
1
delete [] A;
в его ячейках остаются адреса обьектов
C++
1
 p = new Rafa(i+1);?
0
Krasiosoft
51 / 51 / 23
Регистрация: 01.06.2015
Сообщений: 189
05.07.2015, 19:00 #4
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Нужно так:
C++
1
for(int i=0;i<count;i++) delete [] A[i];
А только потом удалять память массива указателей:
C++
1
delete [] A;
1
rjxk
7 / 7 / 9
Регистрация: 18.06.2015
Сообщений: 30
05.07.2015, 19:11 #5
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
в его ячейках остаются адреса обьектов
остаются
1
RAFA91
Заблокирован
07.07.2015, 14:03  [ТС] #6
Цитата Сообщение от rjxk Посмотреть сообщение
остаются
С указателями вечно так.

Освободишь адрес ячейки , но в ячейке останется старое значение (((
0
Krasiosoft
51 / 51 / 23
Регистрация: 01.06.2015
Сообщений: 189
07.07.2015, 15:26 #7
Цитата Сообщение от RAFA91 Посмотреть сообщение
С указателями вечно так.
Освободишь адрес ячейки , но в ячейке останется старое значение
Очень часто видел, что при удалении проверяют, чтоб указатель был не 0. А после удаления присваивают в указатель 0. Примерно так:
C++
1
2
3
4
    if(A){ 
        delete[]A;
        A=0;
    }
1
RAFA91
Заблокирован
07.07.2015, 16:03  [ТС] #8
что самое интересное, так это то , что после удаление ячейки по адресу х , в х сохраняется этот адрес и я

могу туда что-то запихнуть
C++
1
*x = 777;
. это очень меня убивает (((

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
#include<iostream>
#include<conio.h>
#include <stdio.h>
 
using namespace std;
 
 
 
int main()
 
{
    int *x = new int (10);
 
    printf("\n**** x = %d %p\n",*x,x);
 
    delete x;
 
    *x = 777;
 
    printf("\n**** x = %d %p\n",*x,x);
    
    getch();
 
    return 0;
 
}
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
07.07.2015, 16:07 #9
Цитата Сообщение от RAFA91 Посмотреть сообщение
могу туда что-то запихнуть
Можно забраться на 120 этаж и спрыгнуть. Значит ли это, что нужно так делать?
С++ не будет обеспечивать разработчика памперсами. С++ предполагает, что разработчик сам способен отличить плохое от хорошего.
Цитата Сообщение от RAFA91 Посмотреть сообщение
это очень меня убивает (((
Напротив, это должно тебя радовать. Это значит, что компилятор не делает никаких лишних телодвижений по контролю памяти, которые могли бы потенциально замедлить программу.
1
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
07.07.2015, 16:23 #10
Цитата Сообщение от RAFA91 Посмотреть сообщение
то самое интересное, так это то , что после удаление ячейки по адресу х , в х сохраняется этот адрес и я
delete обозначит память по адресу из x, как снова доступную для выделения. И в задачи delete не входит что-либо делать с твоей переменной x. Потому что зачем?

Добавлено через 2 минуты
Цитата Сообщение от RAFA91 Посмотреть сообщение
могу туда что-то запихнуть
Можешь или нет - это вопрос удачи.
1
RAFA91
Заблокирован
08.07.2015, 12:53  [ТС] #11
при выполнени
C++
1
int *x = new int (10);
в ячейке сидит число 10.

после освобождения ячейки - какой-то мусор (((

что нельзя сказать об этом
0
RAFA91
Заблокирован
09.07.2015, 15:45  [ТС] #12
памперсы мне не помешали бы.

почему меня компилятор не предупредил об утечке памяти ? (((((((

Или ее вовсе небыло ?


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
#include<iostream>
#include<conio.h>
#include <stdio.h>
 
using namespace std;
 
 
 
int main()
 
{
    int *x = new int (10);
 
    int **y = new int *(x);
 
    printf("\n**** x = %p y = %p\n",x,*y);
 
     delete y;
    
    printf("\n**** x = %p *y = %p\n",x,*y);
 
    getch();
 
    return 0;
 
}
0
Krasiosoft
51 / 51 / 23
Регистрация: 01.06.2015
Сообщений: 189
09.07.2015, 16:01 #13
Утечка есть. Вы же не освободили память x:
C++
1
delete[] x;
1
RAFA91
Заблокирован
09.07.2015, 17:03  [ТС] #14
скажите пожалуйста , а зачем тут [] ?

почему компилятор не ругает меня за утечку - но зато очень сильно заругал за это.

C++
1
delete y;delete y; delete y;
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
09.07.2015, 17:13 #15
Цитата Сообщение от RAFA91 Посмотреть сообщение
скажите пожалуйста , а зачем тут [] ?
Незачем. Он опечатался.
[] нужны, только если выделяли массив (new[число]).
1
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
09.07.2015, 17:18 #16
Цитата Сообщение от RAFA91 Посмотреть сообщение
С указателями вечно так.
Освободишь адрес ячейки , но в ячейке останется старое значение (((
1) перейти на язык где нет работы с памятью(ява и т.д)
2) использовать умные указатели
3) разобраться с выделением и освобождением памяти, и не говорить что в с++ можно стрельнуть себе в ногу, все это знают, все с этим как то живут!
1
Krasiosoft
51 / 51 / 23
Регистрация: 01.06.2015
Сообщений: 189
09.07.2015, 17:20 #17
Извините, перепутал:
C++
1
int *x = new int (10);
с:
C++
1
int *x = new int [10];
Нужно без [].
1
rjxk
7 / 7 / 9
Регистрация: 18.06.2015
Сообщений: 30
09.07.2015, 18:36 #18
Цитата Сообщение от RAFA91 Посмотреть сообщение
почему компилятор не ругает меня за утечку
Память выделяется (не выделяется) во время работы программы.

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
#include <iostream>
using namespace std;
 
int main()
{
    int n;
    int *p;
    
    cin >> n;
    
    if (n == 1)
    {
        p = new int;
    }
    else if (n == 2)
    {
        p = new int[10];
    }
    else
    {
        cout << "Error number";
    }
    
    if (n == 1)
        delete p;
    else if (n == 2)
        delete [] p;
    else
        cout << "Память не выделяли. Нечего удалять.";
 
    return 0;
}
Добавлено через 3 минуты
Как в этой программе компилятор проверит утечку памяти?
0
RAFA91
Заблокирован
10.07.2015, 12:58  [ТС] #19
rjxk зачем в 27 строке [] ?

в Вашем варианте утечки вроде нету.

но могу врать !
_______________


у меня такой глупый вопрос :

где находиться динамическая память ? это часом не часть ОЗУ выше стека ?

в микроконтроллерах вроде так. внизу стек - вверху часть ОЗУ для данных.
0
10.07.2015, 12:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 12:58
Привет! Вот еще темы с решениями:

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

Не вызывается деструктор
_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++...

Не вызывается деструктор
#include &lt;iostream&gt; using namespace std; class myclass { int a; public:...

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит...


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

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

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