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

Вызовется ли приватный деструктор? - C++

Восстановить пароль Регистрация
 
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.02.2014, 01:15     Вызовется ли приватный деструктор? #1
Вызовется ли приватный деструктор? И как в С++ можно узнать, освободилась ли память после завершения программы?
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
class A
{
private:
    static A * a;
    
    A()
    {
        // ...
    }
    ~A()
    {
        delete a; /// ???
    }
    
public:
    int x;
    
    static A * foo(int _x)
    {
        a = new A;
        a->x = _x;
        return a;
    }
};
 
A * A::a = nullptr;
 
 
 
int main()
{
    A *a = A::foo(7);
    
    cout << a->x << endl;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 01:26     Вызовется ли приватный деструктор? #2
programina, а чего ему вызываться? вы динамически объект создаете => за его удаление сами отвечаете. Статические данные общие для всех объектов. т.е у вас несколько уничтоженных объектов могут уничтожать одни и те же данные. Зануляйте указатель после delete и проверяйте ну NULL
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.02.2014, 01:38  [ТС]     Вызовется ли приватный деструктор? #3
Если бы вот так можно было проверить... Но к сожалению, так не работает ни с публичным, ни с приватным деструктором.
C++
~A()
{
    cout << "Destructor" << endl;
    delete a; 
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
13.02.2014, 01:57     Вызовется ли приватный деструктор? #4
programina, воспользуйся valgrind и увидешь, сколько памяти выделено и сколько возвращено системе назад.

Добавлено через 5 минут
Цитата Сообщение от programina Посмотреть сообщение
Если бы вот так можно было проверить... Но к сожалению, так не работает ни с публичным, ни с приватным деструктором.
Всё работает, просто ты не успеваешь увидеть... Запусти програму не с ide, а с консоли.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 02:07     Вызовется ли приватный деструктор? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
programina, Вы наверное не понимаете разницу Десструктор вызвается при уничтожении объекта. Для объектов в стеке, при выходе за границы блока, в котором существует данный объект, он вызывается автоматически. Но вы выделяете память сами в куче => контроль освобождения памяти лежит на вас. Вы можете сделать метод для особождения памяти статического поля, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~A()
    {
        cout << "Destructor" << endl;
    }
 
static bool Del()
    {
        if (a != nullptr)
        {
            delete a;
            return true;
        }
 
        return false;
    }
И вызовом
C++
1
A::Del();
Очищать эту память.
Здесь как раз-таки в строчке delete a будет вызываться десструктор.
Т.е - освобождать статические данные в десструкторе не нужно!

Добавлено через 39 секунд
И никакой роли не играет - публичный/приватный ли у вас десструктор.
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:27     Вызовется ли приватный деструктор? #6
kventin_zhuk, здравствуйте! Я вот сижу и не могу понять: пример, который предложил ТС, по моему не должен компилироваться, т.к в методе foo мы выделяем память под экземпляр класса А, тем самым вызывая конструктор по умолчанию, который задан явно, и который приватный, т.е к нему нет доступа. Но чудесным образом, всё работает. Почему? И дествительно ли неважно, приватный или публичный деструктор? Ведь к приватному деструктору также нет доступа.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 02:39     Вызовется ли приватный деструктор? #7
somebdy, В чем смысл модификатора доступa private - не виден извне и поля/методы не доступны наследникам. Если в функции main напишите
C++
1
A *obj = new A;
Компилятор возмутится и скажет что-то в стиле cannot access to private member of class A.
Но мы создаем объект внутри статического метода - там этот конструктор великолепно виден
Для мониторинга процесса можете поставить вывод в нем чего нибудь аля, привет я конструктор или воспользоваться точками останова.
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:45     Вызовется ли приватный деструктор? #8
kventin_zhuk, ах вот оно как! С этой, стороны я как-то и не подумал. Благодарю за разъяснение!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 09:17     Вызовется ли приватный деструктор?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
13.02.2014, 09:17     Вызовется ли приватный деструктор? #9
Цитата Сообщение от programina Посмотреть сообщение
И как в С++ можно узнать, освободилась ли память после завершения программы?
Да, интересно. В данном случае он не вызывается. Проверить можно еще и вот так:
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
#include <iostream.h>
 
class A
{
private:
    static A * a;
 
    A()
    {
        cout << "Constructor A" << endl;
        // ...
    }
    ~A()
    {
        cout << "Destructor A" << endl;
        this->x = NULL; // !
        delete a; /// ???
        a = NULL;
    }
 
public:
    int x;
 
    static A * foo(int _x)
    {
        a = new A();
        a->x = _x;
        return a;
    }
};
 
A * A::a = NULL;
 
int *func()
{
return &( A::foo(4)->x );
}
 
 
int main()
{
   //A *a = A::foo(7);
   //cout << a->x << endl;
   int *adr = func();
   cout << "A::x=" << *adr << endl;
}
kventin_zhuk прав:
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
54
55
56
57
58
#include <iostream.h>
 
class A
{
private:
    static A * a;
 
    A()
    {
        cout << "Constructor A" << endl;
        // ...
    }
    ~A()
    {
        cout << "Destructor A" << endl;
    }
 
public:
    int x;
 
    static A * foo(int _x)
    {
        a = new A();
        a->x = _x;
        return a;
    }
 
    static bool Del()
    {
        if (a != NULL)
        {
            delete a;
            a = NULL;
            return true;
        }
        return false;
    }
};
 
A * A::a = NULL;
 
int *func()
{
return &( A::foo(4)->x );
}
 
 
int main()
{
   //A *a = A::foo(7);
   //cout << a->x << endl;
   int *adr = func();
   cout << "A::x=" << *adr << endl;
 
   cout << A::Del() << endl;
 
   cout << "A::x=" << *adr << endl;
}
Yandex
Объявления
13.02.2014, 09:17     Вызовется ли приватный деструктор?
Ответ Создать тему
Опции темы

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