Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199

Unique_ptr и деструктор класса

31.05.2014, 02:22. Показов 3233. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример простого класса:
C++
1
2
3
4
5
6
7
8
9
10
//.h
class TMyClass
{
public:
TMyClass();
~TMyClass();
 
private:
LRESULT CALLBACK myWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
C++
1
2
3
4
5
6
7
8
9
10
//.cpp
TMyClass::TMyClass()
{
   CreateNewWindow();
}
//------------------
TMyClass::~TMyClass()
{
MessageBox(0, L"Деструтор сработал", L"Info", MB_OK);
}
Для автоматической очистики памяти воспользуюсь умным указателем unique_ptr и создаю объект так:
C++
1
2
3
4
void my_func()
{
unique_ptr<TMyClass> myclass(new TMyClass);
}
Некоторые пояснения по коду: здесь функция CreateNewWindow() создаёт новое окно, которое в качестве оконной процедуры использует функцию-член класса TMyClass - myWndProc.
Вопрос: почему в таком случае сразу же срабатывает деструктор, информируя об этом окном с сообщением "Деструтор сработал"? Ведь окно, созданное функцией CreateNewWindow(), ещё продолжает существовать и продолжает работать с членами класса TMyClass.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2014, 02:22
Ответы с готовыми решениями:

Можно ли Конструктор и Деструктор вызывать как метод класса?
Собственно вопрос: можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса? Например, я хочу управлять...

Передача unique_ptr в конструктор другого класса
Как нужно передать unique_ptr в конструктор др. класса? есть такой код: .h файл: class MainClass { private: ...

Деструктор класса
struct date//Структура даты рождения { int d, m, y; }; struct students//Структура студента { string name; string group; ...

27
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199
02.06.2014, 17:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Demy85 Посмотреть сообщение
Очищаешь список (с удалением всех экземпляров класса) при отключении dll-ки от потока.
Это понятно, но нужно не всё сразу удалять при отключении библиотеки, а так: например, закрыли окно №1 - удалили экземпляр класса, создавшего его; закрыли окно №5 - опять же - удалили экземпляр класса, создавшего его. Не нужно ждать, пока библиотека будет отключена - нужно удалять экземпляры классов по мере закрытия окон, созданных ими.
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
03.06.2014, 09:07
Цитата Сообщение от Igor-84 Посмотреть сообщение
Это понятно, но нужно не всё сразу удалять при отключении библиотеки, а так: например, закрыли окно №1 - удалили экземпляр класса, создавшего его; закрыли окно №5 - опять же - удалили экземпляр класса, создавшего его. Не нужно ждать, пока библиотека будет отключена - нужно удалять экземпляры классов по мере закрытия окон, созданных ими.
В таком случае непонятно какие цели ставятся перед классом. Если класс удаляется при закрытии окна, тогда он явно не предназначен для внешнего управления окном. Если класс предназначен для внешнего управления, тогда он явно не должен удаляться при закрытии окна. Если есть желание чтобы экземпляры класса не накапливались, тогда, при использовании списка экземпляров класса, можно при вызове функции my_func() удалять невалидные экземпляры.
0
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199
03.06.2014, 14:23  [ТС]
Цитата Сообщение от Demy85 Посмотреть сообщение
В таком случае непонятно какие цели ставятся перед классом
Всё просто: цель использования класса такова:
1. создать экземпляр класса
2. созданный экземпляр создаёт новое окно
3. работаем с окном.
4. закрываем окно.
5. когда окно закрыто - класс должен быть уничтожен.
Нужна именно такая схема работы.
Demy85, напиши, пожалуйста, пример реализации именно такого порядка работы.
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
03.06.2014, 19:43
Цитата Сообщение от Igor-84 Посмотреть сообщение
Всё просто: цель использования класса такова:
1. создать экземпляр класса
2. созданный экземпляр создаёт новое окно
3. работаем с окном.
4. закрываем окно.
5. когда окно закрыто - класс должен быть уничтожен.
Нужна именно такая схема работы.
Это не цель класса, а, как ты правильно написал, схема работы.
0
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199
04.06.2014, 01:41  [ТС]
Demy85, ты писал:
Цитата Сообщение от Demy85 Посмотреть сообщение
но деструтор не вызывается, т.к. мы крутимся в цикле обработки событий конструктора второго окна
ты о этом участке кода:
C++
1
2
3
4
5
6
7
8
9
10
while(this->is_running)
    {
       //а чтобы окно не зависало, пишу:
       MSG msg;
       while(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
       {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
       }
    }
?
Но почему так происходит? Получается, что если сначала создать первое окно, а затем второе, то этот вышеуказанный цикл первого экземпляра TMyClass приостанавливается, пока работает этот же цикл во втором экземпляре? Я правильно тебя понял? А как сделать независимыми друг от друга эти циклы, чтобы каждый работал самостоятельно внутри своего класса?
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
04.06.2014, 15:24
Цитата Сообщение от Igor-84 Посмотреть сообщение
Получается, что если сначала создать первое окно, а затем второе, то этот вышеуказанный цикл первого экземпляра TMyClass приостанавливается, пока работает этот же цикл во втором экземпляре? Я правильно тебя понял?
Абсолютно правильно.
Цитата Сообщение от Igor-84 Посмотреть сообщение
Но почему так происходит?
Потому что приложение однопоточное, т.е. последующая команда не выполниться, пока не завершиться предыдущая.
Цитата Сообщение от Igor-84 Посмотреть сообщение
А как сделать независимыми друг от друга эти циклы, чтобы каждый работал самостоятельно внутри своего класса?
Создавать окна в разных потоках. Но мне помниться ты говорил, что цикл обработки событий уже работает!
0
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199
04.06.2014, 23:27  [ТС]
Цитата Сообщение от Demy85 Посмотреть сообщение
Но мне помниться ты говорил, что цикл обработки событий уже работает!
Да, я говорил о цикле, который работает в основной (вызывающей) программе. А так, практически весь код моей dll я описал в посте №15.
Цитата Сообщение от Demy85 Посмотреть сообщение
Создавать окна в разных потоках.
Demy85, напиши, пожалуйста, простой пример такой реализации.
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
05.06.2014, 09:19
Цитата Сообщение от Igor-84 Посмотреть сообщение
Demy85, напиши, пожалуйста, простой пример такой реализации.
Где-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
DWORD WINAPI my_func(LPVOID lpParameter)
{
    TMyClass *myclass = new TMyClass;
    delete myclass;
    return 0;
}
 
void createWindow()
{
    CreateThread(NULL, 0, my_func, NULL, 0, NULL);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2014, 09:19

Деструктор класса
когда мы вызываем деструктор, для удаления динамического массива к примеру, нужно ли в нем каким либо образом прописывать удаление...

деструктор класса
Здравствуйте! Я скопировал код отсюда https://msdn.microsoft.com/ru-ru/library/6t4fe76c.aspx себе в Visual Studio 2015, после...

Деструктор класса
Имеется собственный класс, возник вопрос, деструктор класса вызывается не явно ? если так, то в какой момент он вызывается ?

Деструктор класса-наследника
Имеется класс Polinom, у которого в private полях степень n полинома и массив koef коэффициентов. Наследник - это класс Exponenta, у...

Деструктор для класса
У меня есть класс нужен диструтор для этого класса class Hiramuto :public voin { public: Hiramuto (){ x=66; ...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru