Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
RAFA91
Заблокирован
05.07.2015, 15:21     Почему не вызывается деструктор? #1
Всем доброго времени суток!

Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Velesthau
523 / 425 / 129
Регистрация: 25.11.2014
Сообщений: 1,662
05.07.2015, 15:23     Почему не вызывается деструктор? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от RAFA91 Посмотреть сообщение
delete [] A;
Удалил память выделенную для массива указателей, для объектов не удалил.
Цитата Сообщение от RAFA91 Посмотреть сообщение
for(int i=0;i<5;i++)
{
p = new Rafa(i+1);
A[i] = p;
}
Выделяем мы ее в цикле, а удаляем почему-то по-другому.
RAFA91
Заблокирован
05.07.2015, 18:12  [ТС]     Почему не вызывается деструктор? #3
при удалении массива указателей
C++
1
delete [] A;
в его ячейках остаются адреса обьектов
C++
1
 p = new Rafa(i+1);?
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
05.07.2015, 19:00     Почему не вызывается деструктор? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нужно так:
C++
1
for(int i=0;i<count;i++) delete [] A[i];
А только потом удалять память массива указателей:
C++
1
delete [] A;
rjxk
 Аватар для rjxk
7 / 7 / 6
Регистрация: 18.06.2015
Сообщений: 30
05.07.2015, 19:11     Почему не вызывается деструктор? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от RAFA91 Посмотреть сообщение
в его ячейках остаются адреса обьектов
остаются
RAFA91
Заблокирован
07.07.2015, 14:03  [ТС]     Почему не вызывается деструктор? #6
Цитата Сообщение от rjxk Посмотреть сообщение
остаются
С указателями вечно так.

Освободишь адрес ячейки , но в ячейке останется старое значение (((
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
07.07.2015, 15:26     Почему не вызывается деструктор? #7
Цитата Сообщение от RAFA91 Посмотреть сообщение
С указателями вечно так.
Освободишь адрес ячейки , но в ячейке останется старое значение
Очень часто видел, что при удалении проверяют, чтоб указатель был не 0. А после удаления присваивают в указатель 0. Примерно так:
C++
1
2
3
4
    if(A){ 
        delete[]A;
        A=0;
    }
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;
 
}
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
07.07.2015, 16:07     Почему не вызывается деструктор? #9
Цитата Сообщение от RAFA91 Посмотреть сообщение
могу туда что-то запихнуть
Можно забраться на 120 этаж и спрыгнуть. Значит ли это, что нужно так делать?
С++ не будет обеспечивать разработчика памперсами. С++ предполагает, что разработчик сам способен отличить плохое от хорошего.
Цитата Сообщение от RAFA91 Посмотреть сообщение
это очень меня убивает (((
Напротив, это должно тебя радовать. Это значит, что компилятор не делает никаких лишних телодвижений по контролю памяти, которые могли бы потенциально замедлить программу.
Velesthau
523 / 425 / 129
Регистрация: 25.11.2014
Сообщений: 1,662
07.07.2015, 16:23     Почему не вызывается деструктор? #10
Цитата Сообщение от RAFA91 Посмотреть сообщение
то самое интересное, так это то , что после удаление ячейки по адресу х , в х сохраняется этот адрес и я
delete обозначит память по адресу из x, как снова доступную для выделения. И в задачи delete не входит что-либо делать с твоей переменной x. Потому что зачем?

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

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

что нельзя сказать об этом
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;
 
}
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
09.07.2015, 16:01     Почему не вызывается деструктор? #13
Утечка есть. Вы же не освободили память x:
C++
1
delete[] x;
RAFA91
Заблокирован
09.07.2015, 17:03  [ТС]     Почему не вызывается деструктор? #14
скажите пожалуйста , а зачем тут [] ?

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

C++
1
delete y;delete y; delete y;
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
09.07.2015, 17:13     Почему не вызывается деструктор? #15
Цитата Сообщение от RAFA91 Посмотреть сообщение
скажите пожалуйста , а зачем тут [] ?
Незачем. Он опечатался.
[] нужны, только если выделяли массив (new[число]).
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
09.07.2015, 17:18     Почему не вызывается деструктор? #16
Цитата Сообщение от RAFA91 Посмотреть сообщение
С указателями вечно так.
Освободишь адрес ячейки , но в ячейке останется старое значение (((
1) перейти на язык где нет работы с памятью(ява и т.д)
2) использовать умные указатели
3) разобраться с выделением и освобождением памяти, и не говорить что в с++ можно стрельнуть себе в ногу, все это знают, все с этим как то живут!
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
09.07.2015, 17:20     Почему не вызывается деструктор? #17
Извините, перепутал:
C++
1
int *x = new int (10);
с:
C++
1
int *x = new int [10];
Нужно без [].
rjxk
 Аватар для rjxk
7 / 7 / 6
Регистрация: 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 минуты
Как в этой программе компилятор проверит утечку памяти?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 12:58     Почему не вызывается деструктор?
Еще ссылки по теме:

C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
C++ Вызывается ли деструктор в данной программе?
Не вызывается деструктор структуры C++
C++ Почему вызывается деструктор?
Почему деструктор вызывается два раза C++

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

Или воспользуйтесь поиском по форуму:
RAFA91
Заблокирован
10.07.2015, 12:58  [ТС]     Почему не вызывается деструктор? #19
rjxk зачем в 27 строке [] ?

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

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


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

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

в микроконтроллерах вроде так. внизу стек - вверху часть ОЗУ для данных.
Yandex
Объявления
10.07.2015, 12:58     Почему не вызывается деструктор?
Ответ Создать тему
Опции темы

Текущее время: 12:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru