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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
#1

Потоки и выделение памяти в куче - C++

30.05.2012, 10:08. Просмотров 2357. Ответов 5
Метки нет (Все метки)

Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного.
У меня возникают исключения при (или после) выделении памяти оператором new. Причём не в каком-то определённом месте а как-то хаотически (то тут, то там).
Убрал все операторы new всё заработало нормально, но такой вариант не подходит для общего случая.
VS.NET 2003.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 10:08     Потоки и выделение памяти в куче
Посмотрите здесь:

Выделение памяти C++
Выделение памяти C++
Выделение памяти C++
Нужно перевести из С++ в C строку с выделением памяти в куче C++
C++ Указатели (Выделение памяти в куче)
C++ Выделение памяти
C++ Работа в неуправляемой памяти "куче"
C++ Как происходит процесс выделения памяти в стеке и куче
C++ Выделение памяти в куче для строки для реализации длинной арифметики
Почему это компилируется, ведь под второй массив по идее не выделено в куче памяти C++
Динамическое выделение памяти. Ошибки в куче C++
C++ Нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.05.2012, 12:21     Потоки и выделение памяти в куче #2
А какого рода исключения? Что-то конкретное? Можно пример кода?
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
30.05.2012, 12:38  [ТС]     Потоки и выделение памяти в куче #3
Вот одна из функций (вызывается в других потоках, не в главном):
C++
1
2
3
4
5
6
7
void AppendEdit(CEdit *log, const TCHAR *s){
    TCHAR *text = new TCHAR[log->GetWindowTextLength()+_tcslen(s) + 1];
    log->GetWindowText(text, log->GetWindowTextLength());
    _tcscat(text, s);
    log->SetWindowText(text);
    delete text;
}
Вот сам поток:
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
DWORD WINAPI MyThread(LPVOID lpMyStruct){
    static int count = 0;
    int current(++count);
    CMyStruct *ms = (CMyStruct *)lpMyStruct; //в ms хранится указатель на EditBox диалога созданного главным потоком
 
    TCHAR str[1000];
 
    _stprintf(str, _T("
Thread %i: started."), current);
    AppendEdit(ms->log, str);
 
    CThreadDialog dlg;
    if(-1 == dlg.DoModal()){
        _stprintf(str, _T("
Thread %i: Can't create dialog. %s Exit thread."), current, GetLastErrorString());
        AppendEdit(ms->log, str);
        goto end;
    }
    _stprintf(str, _T("
Thread %i: Message: %s"), current, dlg.m_text);
    AppendEdit(ms->log, str);
 
end:
    _stprintf(str, _T("
Thread %i: exit."), current);
    AppendEdit(ms->log, str);
    delete ms;
    return 0;
}
Исключение происходит где-то после DoModal(), но перед _stprintf()...
Output:
ERROR: Critical memory allocation from safety pool failed!
First-chance exception at 0x7c81eb33 in ThreadTest.exe: Microsoft C++ exception: CMemoryException @ 0x00f0f488.
Unhandled exception at 0x7c81eb33 in ThreadTest.exe: Microsoft C++ exception: CMemoryException @ 0x00f0f488.
и т.п.

Исключение в atltrace.h:
C++
1
2
3
4
5
    void __cdecl TraceV(const char *pszFileName, int nLine,
        DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
    {
        AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
    }
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.05.2012, 12:46     Потоки и выделение памяти в куче #4
Твоя проблема не в выделении памяти, а в использовании DoModal. Вот здесь описывается твоя ситуация: http://www.developerfusion.co.uk/show/1715/5/

Удачи,
Владимир
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
30.05.2012, 13:32  [ТС]     Потоки и выделение памяти в куче #5
Да, я где-то читал, что с GUI в потоках есть проблемы...
Но я переписал AppendEdit() и всё теперь работает прекрасно, в т.ч. DoModal().
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void AppendEdit(CEdit *log, const TCHAR *s){
    //TCHAR *text = new TCHAR[log->GetWindowTextLength()+_tcslen(s) + 1];
    HANDLE hh = ::HeapCreate(0, 2000, 0);
    TCHAR *text = (TCHAR *)HeapAlloc(hh, 0, log->GetWindowTextLength()+_tcslen(s) + 1);
 
    log->GetWindowText(text, log->GetWindowTextLength());
    _tcscat(text, s);
    log->SetWindowText(text);
 
    //delete text;
    HeapFree(hh, 0, text);
    HeapDestroy(hh);
}
Т.е. для выделения/освобождения памяти я использовал функции HeapXxxxxx().

Кстати, вкратце, какие бывают потоки и чем они отличаются. Что за worker thread, UI thread и какие там ещё есть...
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
31.05.2012, 11:38     Потоки и выделение памяти в куче #6
Не уверен, что могу компетентно ответить на вопрос про различные виды потоков. Я для себя обычно различал основной поток - тот что начинает работу при запуске приложения и вспомогательные, те что в вышеупомянутой статье названы "worker thread", который создаются командой CreateThread или _beginthreadex

Для MFC приложений основной поток является UI потоком (предположение).

С уважением,
Владимир
Yandex
Объявления
31.05.2012, 11:38     Потоки и выделение памяти в куче
Ответ Создать тему
Опции темы

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