Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Заблокирован
1

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

05.07.2015, 15:21. Просмотров 1461. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2015, 15:21
Ответы с готовыми решениями:

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

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

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

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

18
528 / 430 / 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
Заблокирован
05.07.2015, 18:12  [ТС] 3
при удалении массива указателей
C++
1
delete [] A;
в его ячейках остаются адреса обьектов
C++
1
 p = new Rafa(i+1);?
0
52 / 52 / 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
7 / 7 / 9
Регистрация: 18.06.2015
Сообщений: 30
05.07.2015, 19:11 5
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

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

Освободишь адрес ячейки , но в ячейке останется старое значение (((
0
52 / 52 / 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
Заблокирован
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
13884 / 7419 / 1760
Регистрация: 30.01.2014
Сообщений: 12,412
07.07.2015, 16:07 9
Цитата Сообщение от RAFA91 Посмотреть сообщение
могу туда что-то запихнуть
Можно забраться на 120 этаж и спрыгнуть. Значит ли это, что нужно так делать?
С++ не будет обеспечивать разработчика памперсами. С++ предполагает, что разработчик сам способен отличить плохое от хорошего.
Цитата Сообщение от RAFA91 Посмотреть сообщение
это очень меня убивает (((
Напротив, это должно тебя радовать. Это значит, что компилятор не делает никаких лишних телодвижений по контролю памяти, которые могли бы потенциально замедлить программу.
1
528 / 430 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
07.07.2015, 16:23 10
Цитата Сообщение от RAFA91 Посмотреть сообщение
то самое интересное, так это то , что после удаление ячейки по адресу х , в х сохраняется этот адрес и я
delete обозначит память по адресу из x, как снова доступную для выделения. И в задачи delete не входит что-либо делать с твоей переменной x. Потому что зачем?

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

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

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

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

C++
1
delete y;delete y; delete y;
0
13884 / 7419 / 1760
Регистрация: 30.01.2014
Сообщений: 12,412
09.07.2015, 17:13 15
Цитата Сообщение от RAFA91 Посмотреть сообщение
скажите пожалуйста , а зачем тут [] ?
Незачем. Он опечатался.
[] нужны, только если выделяли массив (new[число]).
1
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
09.07.2015, 17:18 16
Цитата Сообщение от RAFA91 Посмотреть сообщение
С указателями вечно так.
Освободишь адрес ячейки , но в ячейке останется старое значение (((
1) перейти на язык где нет работы с памятью(ява и т.д)
2) использовать умные указатели
3) разобраться с выделением и освобождением памяти, и не говорить что в с++ можно стрельнуть себе в ногу, все это знают, все с этим как то живут!
1
52 / 52 / 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
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
Заблокирован
10.07.2015, 12:58  [ТС] 19
rjxk зачем в 27 строке [] ?

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

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


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

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

в микроконтроллерах вроде так. внизу стек - вверху часть ОЗУ для данных.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2015, 12:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему не вызывается деструктор, а точнее как его вызвать?
#include &lt;iostream&gt; using namespace std; class MyClass { private: int n; int* fibs; ...

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

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

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


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

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

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