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

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

Войти
Регистрация
Восстановить пароль
 
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

13.02.2014, 01:15. Просмотров 756. Ответов 8
Метки нет (Все метки)

Вызовется ли приватный деструктор? И как в С++ можно узнать, освободилась ли память после завершения программы?
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;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 01:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызовется ли приватный деструктор? (C++):

Приватный конструктор и деструктор - C++
Зачем нужны приватный конструктор и деструктор? Как они работают?

shared_ptr и приватный деструктор - C++
Хочу перенести деструктор в приватные члены класса A, но класс используется в boost::shared_ptr&lt;A&gt; и boost::weak_ptr&lt;A&gt;. Какой класс...

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

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? - C++
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...

Как изменить статический приватный член класса? - C++
Как изменить статический приватный член класса если менять его нужно в main()!??

Как добавить в вектор приватный объект класса - C++
Как добавить в вектор приватный объект класса? К примеру . ... class Class { public: int metod(); // который = b int i;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 01:26 #2
programina, а чего ему вызываться? вы динамически объект создаете => за его удаление сами отвечаете. Статические данные общие для всех объектов. т.е у вас несколько уничтоженных объектов могут уничтожать одни и те же данные. Зануляйте указатель после delete и проверяйте ну NULL
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.02.2014, 01:38  [ТС] #3
Если бы вот так можно было проверить... Но к сожалению, так не работает ни с публичным, ни с приватным деструктором.
C++
~A()
{
    cout << "Destructor" << endl;
    delete a; 
}
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
13.02.2014, 01:57 #4
programina, воспользуйся valgrind и увидешь, сколько памяти выделено и сколько возвращено системе назад.

Добавлено через 5 минут
Цитата Сообщение от programina Посмотреть сообщение
Если бы вот так можно было проверить... Но к сожалению, так не работает ни с публичным, ни с приватным деструктором.
Всё работает, просто ты не успеваешь увидеть... Запусти програму не с ide, а с консоли.
1
kventin_zhuk
БНТУ ФИТР
215 / 155 / 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 секунд
И никакой роли не играет - публичный/приватный ли у вас десструктор.
1
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:27 #6
kventin_zhuk, здравствуйте! Я вот сижу и не могу понять: пример, который предложил ТС, по моему не должен компилироваться, т.к в методе foo мы выделяем память под экземпляр класса А, тем самым вызывая конструктор по умолчанию, который задан явно, и который приватный, т.е к нему нет доступа. Но чудесным образом, всё работает. Почему? И дествительно ли неважно, приватный или публичный деструктор? Ведь к приватному деструктору также нет доступа.
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 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.
Но мы создаем объект внутри статического метода - там этот конструктор великолепно виден
Для мониторинга процесса можете поставить вывод в нем чего нибудь аля, привет я конструктор или воспользоваться точками останова.
1
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:45 #8
kventin_zhuk, ах вот оно как! С этой, стороны я как-то и не подумал. Благодарю за разъяснение!
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 09:17
Привет! Вот еще темы с ответами:

Приватный конструктор и стандартный контейнер. Два барана на мосту - C++
Всем суп! Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова: class AAA { private: ...

Деструктор - C++
Доброго времени суток, есть некоторый класс и 2 функции подобны тем, что описаны ниже. В первой объявляется данный класс, обрабатывается и...

Деструктор - C++
Я написал деструктор, но препод сказал переделать так как надо было смотреть на то, как я выделял память. Помогите исправить. int **m6; ...

Деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include &lt;crtdbg.h&gt; using namespace std; class list{ ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.02.2014, 09:17
Ответ Создать тему
Опции темы

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