Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Я в этом не шарю
 Аватар для Segaman
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191

При попытке очистки классов, деструктор падает

19.09.2014, 11:45. Показов 716. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем при создании окна (WM_CREATE). я создаю класс и присваиваю его поинтер в USERDATA.
внутри класса я объявляю массив окон со своими классами в USERDATA.
этот самый массив пытаюсь удалить при WM_CLOSE и WM_DESTROY, но удаление(delete), когда хочет, тогда и срабатывает.
а если не сработает, то деструктор просто перестаёт обработку оставшегося кода и всё.
вот класс:
C++
1
2
3
4
5
6
7
class ExListview
{
public:
    ExListview(HWND _hwnd);
    ~ExListview();
    HWND        item[itemssmax];
}
вот WM_CREATE:
C++
1
2
3
4
5
6
if (message==WM_CREATE)
    {
        ExListview*b = new ExListview(hwnd);
        SetWindowLongPtr(hwnd, GWLP_USERDATA, (ULONG)b);
        return 0;
    }
вот деструктор:
C++
1
2
3
4
5
6
7
8
ExListview::~ExListview()
{
    for(int i=0;i<itemssmax;i++)
    {
        ExList*a = GetExListviewItem(hwnd,i);
        if ((int)a)delete a;
    }
}
функция GetExListviewItem возвращает класс (ExList) присвоенный каждому окну item из класса ExListview.
деструктора у ExList нет.

так вот я пробовал проверять чему равно ExList*a.
пробовал создавать деструктор ExList с выводом текста.
пробовал ставить сообщения перед delete и после delete.
вышло что-то вроде
C++
1
2
3
4
5
6
7
8
9
10
11
    MessageBox(0,"start deleting","~ExListview",MB_ICONINFORMATION);
    for(int i=0;i<itemssmax;i++)
    {
        //MessageBox(0,"start item","~ExListview",MB_ICONINFORMATION);
        ExList*a = GetExListviewItem(hwnd,i);
        ShowInt((int)a,"before delete item");
        if ((int)a)delete a;
        ShowInt((int)a,"after delete item");
        //MessageBox(0,"finished item","~ExListview",MB_ICONINFORMATION);
    }
    MessageBox(0,"delete items","~ExListview",MB_ICONINFORMATION);
C++
1
2
3
4
ExList::~ExList()
{
    MessageBox(0,"delete exlist","~ExList",MB_ICONINFORMATION);
}
так вот, когда всё падает показывается только сообщение перед delete ("before delete item").
т.е. сообщения в ExList деструкторе нет и сообщения после delete тоже нет.
в чем я не прав?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2014, 11:45
Ответы с готовыми решениями:

Вылет при попытке очистки консоли
В программе много раз вызывается функция, которая очищает окно консоли с помощью команды system(&quot;cls&quot;); и...

Непонятное сообщение при попытке очистки консоли
Доброго времени суток. OS - Mac OS, среда разработки - XCode. Хочу очистить консоль, пишу в программе: ...

Срабатывание точки останова при попытке очистки памяти
Здравствуйте! Суть задания - есть массив, заполненный случайными числами. Потом это массив нужно изменить, от первых его k нечетных...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.09.2014, 22:23
Цитата Сообщение от Segaman Посмотреть сообщение
этот самый массив пытаюсь удалить при WM_CLOSE и WM_DESTROY
Выберите что-то одно, иначе получится двойное удаление.

Цитата Сообщение от Segaman Посмотреть сообщение
SetWindowLongPtr(hwnd, GWLP_USERDATA, (ULONG)b);
Опасно !
Размер ULONG - 4 байта, размер указателя может быть 8 байт (на x64).

Цитата Сообщение от Segaman Посмотреть сообщение
if ((int)a)delete a;
Незачем проверять на NULL.
По стандарту, delete на нулевом указателе - разрешенная операция.
Про усечение ptr в int уже написал выше.

Цитата Сообщение от Segaman Посмотреть сообщение
ShowInt((int)a,"before delete item");
Снова усечение. Лучше какой-нибудь printf со спецификатором %p.

Цитата Сообщение от Segaman Посмотреть сообщение
в чем я не прав?
Хотелось бы видеть деструктор ExListview и функцию GetExListviewItem,
может ошибка там.
0
Я в этом не шарю
 Аватар для Segaman
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
22.09.2014, 15:48  [ТС]
Убежденный,
C++
1
2
3
4
5
6
7
8
/*=====================================================================================================*/
//получить класс элемента списка
ExList*GetExListviewItem(HWND hwnd, int slot)
{
    ExListview*a = (ExListview*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    return GetExList(a->item[slot]);
}
/*=====================================================================================================*/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ExListview::~ExListview()
{
    //MessageBox(0,"start deleting","~ExListview",MB_ICONINFORMATION);
    for(int i=0;i<itemssmax;i++)
    {
        //MessageBox(0,"start item","~ExListview",MB_ICONINFORMATION);
        ExList*a = GetExListviewItem(hwnd,i);
        //ShowInt((int)a,"before delete item");
        if ((int)a)delete a;
        //ShowInt((int)a,"after delete item");
        //MessageBox(0,"finished item","~ExListview",MB_ICONINFORMATION);
    }
}
компилирую я только 32битную версию. в 64 надобности нет.

Добавлено через 16 секунд
Убежденный,
C++
1
2
3
4
5
6
7
8
/*=====================================================================================================*/
//получить класс элемента списка
ExList*GetExListviewItem(HWND hwnd, int slot)
{
    ExListview*a = (ExListview*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    return GetExList(a->item[slot]);
}
/*=====================================================================================================*/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ExListview::~ExListview()
{
    //MessageBox(0,"start deleting","~ExListview",MB_ICONINFORMATION);
    for(int i=0;i<itemssmax;i++)
    {
        //MessageBox(0,"start item","~ExListview",MB_ICONINFORMATION);
        ExList*a = GetExListviewItem(hwnd,i);
        //ShowInt((int)a,"before delete item");
        if ((int)a)delete a;
        //ShowInt((int)a,"after delete item");
        //MessageBox(0,"finished item","~ExListview",MB_ICONINFORMATION);
    }
}
компилирую я только 32битную версию. в 64 надобности нет.
0
Я в этом не шарю
 Аватар для Segaman
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
26.09.2014, 16:29  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Опасно !
Размер ULONG - 4 байта, размер указателя может быть 8 байт (на x64).
так и есть. на Windows 8 программа падает. Куда тогда можно писать указатель?
сосдавать массив ссылок с последующей идентификацией как-то не хочется.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
26.09.2014, 17:30
Цитата Сообщение от Segaman Посмотреть сообщение
Куда тогда можно писать указатель?
Туда же, но не надо приводить его к ULONG, приводи к LONG_PTR
0
Я в этом не шарю
 Аватар для Segaman
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
26.09.2014, 17:54  [ТС]
заменил ULONG на LONG_PTR, но на Windows 8 все равно падение при попытке записи в USERDATA.
даже если компилить в 64 бита
0
31 / 31 / 5
Регистрация: 24.09.2014
Сообщений: 243
30.09.2014, 20:19
Сделай проверку существования окна (IsWindow) в каждой функции, где оно используется.
"Отбрейк-пойнти" каждую функцию, нет ли где "нулевых" классов / переменных, к которым потом идёт обращение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2014, 20:19
Помогаю со студенческими работами здесь

MySQL Падает при попытке изменения конфига
Доброй, чего-то я в корне недопонимаю. Есть VPS, на нём: # uname -a Linux kvmde55-12078.fornex.org 4.4.0-89-generic #112-Ubuntu SMP...

Программа падает при попытке вывести диалог
Ест проект QT (простите за грязный код, если кто ни-будь чего-нибудь посоветует, буду очень благодарен): mainwindow.h #ifndef...

Программа падает при попытке записи элементов структуры
Есть такая структура struct Follower { //структура char Words; float Count; char kod; }; Она описывается как массив в main.При...

Приложение падает при попытке соединения через сокет
IPEndPoint ipEndPoint = new IPEndPoint(ip, port); Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream,...

При попытке обновить поле падает mysql на денвере
Запрос на грани фантастики: MySQL_Query(&quot;UPDATE `pages` SET `rus_name`='$name', `content`='$text', `name`='$translit' WHERE...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
ПЛИС
zxcha1ka_ 27.01.2026
AHDL Разработать программы для синтеза следующих устройств: 1. Параллельного регистра 4-х разрядного с синхронной загрузкой и асинхронным сбросом (обнулением); Пoмoгитe пoжaлyйстa
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru