Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

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

13.02.2014, 01:15. Показов 4536. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2014, 01:15
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 5 минут
Цитата Сообщение от programina Посмотреть сообщение
Если бы вот так можно было проверить... Но к сожалению, так не работает ни с публичным, ни с приватным деструктором.
Всё работает, просто ты не успеваешь увидеть... Запусти програму не с ide, а с консоли.
1
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 02:07
Лучший ответ Сообщение было отмечено programina как решение

Решение

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
8 / 8 / 3
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:27
kventin_zhuk, здравствуйте! Я вот сижу и не могу понять: пример, который предложил ТС, по моему не должен компилироваться, т.к в методе foo мы выделяем память под экземпляр класса А, тем самым вызывая конструктор по умолчанию, который задан явно, и который приватный, т.е к нему нет доступа. Но чудесным образом, всё работает. Почему? И дествительно ли неважно, приватный или публичный деструктор? Ведь к приватному деструктору также нет доступа.
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
13.02.2014, 02:39
somebdy, В чем смысл модификатора доступa private - не виден извне и поля/методы не доступны наследникам. Если в функции main напишите
C++
1
A *obj = new A;
Компилятор возмутится и скажет что-то в стиле cannot access to private member of class A.
Но мы создаем объект внутри статического метода - там этот конструктор великолепно виден
Для мониторинга процесса можете поставить вывод в нем чего нибудь аля, привет я конструктор или воспользоваться точками останова.
1
8 / 8 / 3
Регистрация: 30.04.2013
Сообщений: 25
13.02.2014, 02:45
kventin_zhuk, ах вот оно как! С этой, стороны я как-то и не подумал. Благодарю за разъяснение!
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.02.2014, 09:17
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2014, 09:17
Помогаю со студенческими работами здесь

В каком случае вызовется деструктор при работе через указатель
Я создаю мультиоконное приложение. Для выведения на экран неглавного окна (все неглавные окна - потомки QDialog), я обращаюсь к нему через...

Зачем вызывать Dispose(), если в итоге вызовется Finalize()?
При использовании классов,работающих с системными ресурсами,желательно (обязательно?) создавать их с помощью using. Компилятор создаст...

Сколько раз вызовется каждый из особых методов класса
Дан код программы. Укажите, сколько раз в нём вызовется каждый из особых методов класса. #include &lt;iostream&gt; using namespace...

Приватный чат
Всем привет, нужна ваша помощь. нужно написать чат, но не обычный, а типа консультация с менеджером, то есть чат расчитан на двоих. ...

Приватный конструктор
Мне нужно для класса Matrix и Vector создать приватные конструкторы, но при этом, чтобы программа осталась рабочей. #include...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru