Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
RAFA91
Заблокирован
#1

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

05.07.2015, 15:21. Просмотров 555. Ответов 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++):

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

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

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

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

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

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

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

Освободишь адрес ячейки , но в ячейке останется старое значение (((
0
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;
    }
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
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.07.2015, 16:07 #9
Цитата Сообщение от RAFA91 Посмотреть сообщение
могу туда что-то запихнуть
Можно забраться на 120 этаж и спрыгнуть. Значит ли это, что нужно так делать?
С++ не будет обеспечивать разработчика памперсами. С++ предполагает, что разработчик сам способен отличить плохое от хорошего.
Цитата Сообщение от RAFA91 Посмотреть сообщение
это очень меня убивает (((
Напротив, это должно тебя радовать. Это значит, что компилятор не делает никаких лишних телодвижений по контролю памяти, которые могли бы потенциально замедлить программу.
1
Velesthau
523 / 425 / 129
Регистрация: 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 / 15
Регистрация: 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
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
09.07.2015, 17:13 #15
Цитата Сообщение от RAFA91 Посмотреть сообщение
скажите пожалуйста , а зачем тут [] ?
Незачем. Он опечатался.
[] нужны, только если выделяли массив (new[число]).
1
09.07.2015, 17:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 17:13
Привет! Вот еще темы с ответами:

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

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

Не вызывается деструктор структуры - C++
Создал класс. Членом класса является указатели на структуру, которая определена в классе. Поля структуры указатели, т.к. работа будет с...

Когда вызывается деструктор класса? - C++
Вопрос собственно в том, когда происходит освобождение памяти, занимаемой объектом класса? Допустим имеем #include &lt;iostream&gt; struct...


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

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

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