[MSVC 2010] Runtime library
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 26.05.11 06:48
Оценка:
Минимальная конфигурация для повторения ошибки.

Есть 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. Менять код не предлагать. Он не мой, а большой сторонней библиотеки. И используется в ней повсеместно.
Re: [MSVC 2010] Runtime library
От: uzhas Ниоткуда  
Дата: 26.05.11 06:57
Оценка: 5 (2) +2
Здравствуйте, Nuzhny, Вы писали:

N>Линковка exe и dll статическая.


вот и причина проблемы

N>Что это? Разные менеджеры памяти используются?


память выделена в одном хипе, а удаляется в другом
нельзя так грубо передавать std::vector через границы длл. это можно делать с кучей оговорок : динамический одинаковый рантайм, модули скомпилированы одними опциями для STL (ну там проверка итераторов и еще какие-то дефайны)
в иделе имхо — Сишный интерфейс должен быть между длл-ками, данные маршалить, сущности проксировать
Re[2]: [MSVC 2010] Runtime library
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 26.05.11 07:12
Оценка:
Здравствуйте, uzhas, Вы писали:

U>нельзя так грубо передавать std::vector через границы длл. это можно делать с кучей оговорок : динамический одинаковый рантайм, модули скомпилированы одними опциями для STL (ну там проверка итераторов и еще какие-то дефайны)


Почти про всё знал, кроме "динамический одинаковый рантайм". Спасибо.
Re: [MSVC 2010] Runtime library
От: MasterZiv СССР  
Дата: 28.05.11 17:41
Оценка: -1
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.