On 26.05.2011 10:48, Nuzhny wrote:
> Если же поставить *Multi-threaded Debug DLL (/MDd)* (на обоих проектах!), то всё
> нормально.
> С релизными RTL та же проблема.
>
> Что это? Разные менеджеры памяти используются?
Да. Как правило, если приложение использует несколько модулей (состоит из
нескольких .exe и .dll), то нужно использовать ОДНУ CRT, и в виде .DLL.
Posted via RSDN NNTP Server 2.1 beta
Минимальная конфигурация для повторения ошибки.
Есть dll с одной экспортируемой функцией.
.h
__declspec(dllexport) void dll_func(void* vec);
.cpp
#include <vector>
void dll_func(void* vec)
{
std::vector<int>* v = (std::vector<int>*)vec;
std::vector<int>& vv = *v;
vv.resize(100);
}
Есть exe, который вызывает функцию:
#include <vector>
void f()
{
std::vector<int> v;
dll_func(&v);
}
int _tmain(int argc, _TCHAR* argv[])
{
f();
return 0;
}
Линковка exe и dll статическая.
Ошибка:
Если в exe и dll выставить Runtime library как
Multi-threaded Debug (/MTd), то приложение падает в деструкторе std::vector после выхода из функции f(), находящейся в exe. Сообщение в логе "HEAP[dll_test.exe]:
Invalid address specified to RtlValidateHeap( 002B0000, 00CF1328 )
Windows has triggered a breakpoint in dll_test.exe.
This may be due to a corruption of the heap, which indicates a bug in dll_test.exe or any of the DLLs it has loaded.
Если же поставить
Multi-threaded Debug DLL (/MDd) (на обоих проектах!), то всё нормально.
С релизными RTL та же проблема.
Что это? Разные менеджеры памяти используются?
P.S. Менять код не предлагать. Он не мой, а большой сторонней библиотеки. И используется в ней повсеместно.