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

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

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

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

05.07.2015, 15:21. Просмотров 502. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2015, 15:21     Почему не вызывается деструктор?
Посмотрите здесь:

Почему вызывается деструктор? - 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;...

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
7 / 7 / 6
Регистрация: 18.06.2015
Сообщений: 30
05.07.2015, 19:11     Почему не вызывается деструктор? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от RAFA91 Посмотреть сообщение
в его ячейках остаются адреса обьектов
остаются
RAFA91
Заблокирован
07.07.2015, 14:03  [ТС]     Почему не вызывается деструктор? #6
Цитата Сообщение от rjxk Посмотреть сообщение
остаются
С указателями вечно так.

Освободишь адрес ячейки , но в ячейке останется старое значение (((
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 17:13     Почему не вызывается деструктор?
Еще ссылки по теме:

Два раза вызывается деструктор - C++
Создал класс, в процессе выполнения программы вызвал деструктор, но когда программа завершается, деструктор вызывается повторно и вылетает...

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

Вызывается ли деструктор в данной программе? - C++
вызывается ли деструктор в данной программе и почему он не выводит на экран,что он выведен...?#include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Вызывается деструктор когда обьект не уничтожен! - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class inkr { private: int a; ...

Деструктор вызывается до то возвращения значения из функции - C++
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...


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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
09.07.2015, 17:13     Почему не вызывается деструктор? #15
Цитата Сообщение от RAFA91 Посмотреть сообщение
скажите пожалуйста , а зачем тут [] ?
Незачем. Он опечатался.
[] нужны, только если выделяли массив (new[число]).
Yandex
Объявления
09.07.2015, 17:13     Почему не вызывается деструктор?
Ответ Создать тему
Опции темы

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