Возникла проблема: в 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 реализованы в CRT. Если использовать Multi-threaded Runtime library, то куча будет потокобезопасной, т.е. доступ к ней будет синхронизирован, например с помощью критической секции. Иначе — придется писать только для одного потока.
Но я и так использую Multi-threaded Runtime library. Как я понимаю, дополнительных средств синхронизации в этом случае не требуется. Почему же ошибка возникает?
Не правильно трактовал вопрос.
Тогда есть догадка: subj.
Т.е. в DLL "зашита" одна runtime-библиотека, в вызывающем модуле — другая. Кучи, соответственно разные. Например, new в DLL не имеет никакого отношения к delete в exe.
Рецепт: перекомпиляция DLL. Опции с ходу не нашел, если получится, поделитесь плз
Нет, дело в том, что проблемная память выделяется, используется и освобождается только внутри самой dll. Вызывающий модуль вообще не имеет доступа к этому блоку памяти. Указатель на блок является членом класса, причем создан глобальный объект этого класса.
Re[2]: Разные CRT
От:
Аноним
Дата:
24.04.06 17:01
Оценка:
Здравствуйте, svir, Вы писали:
S>Нет, дело в том, что проблемная память выделяется, используется и освобождается только внутри самой dll. Вызывающий модуль вообще не имеет доступа к этому блоку памяти. Указатель на блок является членом класса, причем создан глобальный объект этого класса.
Посмотри — нет ли проблем с доступом — он (создание и разрушение в том числе) должны быть полностью атомарны. Иначе порушишь кучу.
Здравствуйте, 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 и они там инстанциируются)
Здравствуйте, 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).
Смотри здесь