Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2015, 19:36   #1
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
Хорошо Thread classes and delete this...

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

Код:
class MyWrkThread
{
       HANDLE m_hThread;
public:
        MyWrkThread()
        {
                //Init
        }
        void Start();
        {
              m_hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CRRSlotMsgProcess::_workerFunc, this, 0, 0);
        }
private:
        void DoJob()
        {
               // Some useless stuff
        }
        static DWORD WINAPI _workerFunc(CRRSlotMsgProcess* pThis)
        {
                    pThis->DoJob();
                    delete pThis;
                    return 0;
        }
}
после окончания у меня программа вылетает с криком попорчен heap - heap попорчен аккурат там, где у меня была имплементация этого класса, а точнее - в переменную m_hThread кто-то опять записал ID handle-a... Что за чудеса? Я в чем-то неправ? Или продолжать искать свои косяки?
PS. Да, имплементация создается только с помощью new, а не автомат на стэке... Т.е "левый" delete не вызывается...

Последний раз редактировалось xe3; 10.03.2015 в 19:41.
xe3 вне форума Ответить с цитированием
Старый 11.03.2015, 13:48   #2
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Если кому интересно - солюшн

Код:
class MyWrkThread
{
       HANDLE m_hThread;
public:
        MyWrkThread()
        {
                //Init
        }
        void Start();
        {
              m_hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CRRSlotMsgProcess::_workerFunc, this, CREATE_SUSPENDED, 0);
              if (m_hThread)
                     ResumeThread(m_hThread);              
        }
private:
        void DoJob()
        {
               // Some useless stuff
        }
        static DWORD WINAPI _workerFunc(CRRSlotMsgProcess* pThis)
        {
                    pThis->DoJob();
                    delete pThis;
                    return 0;
        }
}

Последний раз редактировалось xe3; 11.03.2015 в 18:07.
xe3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Classes vova797 Общие вопросы Delphi 4 14.08.2013 11:55
Ошибка в Classes и в SysUtils LLIALLIJIbIK Общие вопросы Delphi 2 27.06.2013 22:58
Избавиться от модулей SysUtils и Classes RageGod Общие вопросы Delphi 10 13.02.2013 01:40
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14