new и delete в разных потоках
От: svir  
Дата: 24.04.06 07:24
Оценка:
Возникла проблема: в dll-ке, написанной в Visual Studio 2003, выделяю блок памяти в одном потоке с помощью new char[], а освобождаю в другом потоке посредством delete[]. При освобождении памяти выдается сообщение "Debug Assertion Failed ... File: dbgdel.cpp ... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". При компиляции использую RTL Multi-threaded Debug. Если освобождение памяти выполянется в том же потоке, что и выделение, все выполняется нормально. В чем может быть дело? Может, кто-нибудь сталкивался с такой проблемой?
Re: new и delete в разных потоках
От: Дядюшка Че Россия  
Дата: 24.04.06 11:13
Оценка:
Здравствуйте, svir, Вы писали:

Вполне адекватное поведение. Операторы new/delete реализованы в CRT. Если использовать Multi-threaded Runtime library, то куча будет потокобезопасной, т.е. доступ к ней будет синхронизирован, например с помощью критической секции. Иначе — придется писать только для одного потока.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: new и delete в разных потоках
От: svir  
Дата: 24.04.06 11:20
Оценка:
Но я и так использую Multi-threaded Runtime library. Как я понимаю, дополнительных средств синхронизации в этом случае не требуется. Почему же ошибка возникает?
Разные CRT
От: Дядюшка Че Россия  
Дата: 24.04.06 11:36
Оценка:
Не правильно трактовал вопрос.
Тогда есть догадка: subj.
Т.е. в DLL "зашита" одна runtime-библиотека, в вызывающем модуле — другая. Кучи, соответственно разные. Например, new в DLL не имеет никакого отношения к delete в exe.
Рецепт: перекомпиляция DLL. Опции с ходу не нашел, если получится, поделитесь плз
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Разные CRT
От: svir  
Дата: 24.04.06 15:57
Оценка:
Нет, дело в том, что проблемная память выделяется, используется и освобождается только внутри самой dll. Вызывающий модуль вообще не имеет доступа к этому блоку памяти. Указатель на блок является членом класса, причем создан глобальный объект этого класса.
Re[2]: Разные CRT
От: Аноним  
Дата: 24.04.06 17:01
Оценка:
Здравствуйте, svir, Вы писали:

S>Нет, дело в том, что проблемная память выделяется, используется и освобождается только внутри самой dll. Вызывающий модуль вообще не имеет доступа к этому блоку памяти. Указатель на блок является членом класса, причем создан глобальный объект этого класса.


Посмотри — нет ли проблем с доступом — он (создание и разрушение в том числе) должны быть полностью атомарны. Иначе порушишь кучу.
Re: new и delete в разных потоках
От: Mickey_from_nsk  
Дата: 25.04.06 05:32
Оценка:
Здравствуйте, svir, Вы писали:

S>Возникла проблема: в dll-ке, написанной в Visual Studio 2003, выделяю блок памяти в одном потоке с помощью new char[], а освобождаю в другом потоке посредством delete[]. При освобождении памяти выдается сообщение "Debug Assertion Failed ... File: dbgdel.cpp ... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". При компиляции использую RTL Multi-threaded Debug. Если освобождение памяти выполянется в том же потоке, что и выделение, все выполняется нормально. В чем может быть дело? Может, кто-нибудь сталкивался с такой проблемой?


У меня такие вещи проходили спокойно. Единственно, я пользовался Multithreaded Debug dll. Попробуй, может получится.
Re: new и delete в разных потоках
От: Аноним  
Дата: 26.04.06 09:43
Оценка:
S>Возникла проблема: в dll-ке, написанной в Visual Studio 2003, выделяю блок памяти в одном потоке с помощью new char[], а освобождаю в другом потоке посредством delete[]. При освобождении памяти выдается сообщение "Debug Assertion Failed ... File: dbgdel.cpp ... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". При компиляции использую RTL Multi-threaded Debug. Если освобождение памяти выполянется в том же потоке, что и выделение, все выполняется нормально. В чем может быть дело? Может, кто-нибудь сталкивался с такой проблемой?

А можно я тоже поугадываю
Если new или delete написаны в header'е, попробуй перенести их в .cpp
(на случай, если этот header используется из другой dll и они там инстанциируются)
Re: new и delete в разных потоках
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 26.09.06 21:07
Оценка:
Здравствуйте, svir, Вы писали:

S>Возникла проблема: в dll-ке, написанной в Visual Studio 2003, выделяю блок памяти в одном потоке с помощью new char[], а освобождаю в другом потоке посредством delete[]. При освобождении памяти выдается сообщение "Debug Assertion Failed ... File: dbgdel.cpp ... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". При компиляции использую RTL Multi-threaded Debug. Если освобождение памяти выполянется в том же потоке, что и выделение, все выполняется нормально. В чем может быть дело? Может, кто-нибудь сталкивался с такой проблемой?


Видно потоки находятся в разных модулях (dll/exe).
Смотри здесь
Автор(ы): Роман Хациев
Дата: 27.02.2002
Если вы пытались работать с экземплярами классов STL, передавая их в DLL, или получая оттуда, а потом бросили это занятие из-за непонятных ошибок, возникающих в вашей программе, то эта заметка для вас. Даже если видимых проблем в вашей программе нет, то все равно прочитайте эту заметку, чтобы знать что делать, когда они появятся :)
.
-- Андрей
Re: new и delete в разных потоках
От: Аноним  
Дата: 27.09.06 02:45
Оценка:
Вместо new/delete использовать HeapAlloc/HeapFree и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.