powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти в вызываемой функции. В DLL
15 сообщений из 15, страница 1 из 1
Выделение памяти в вызываемой функции. В DLL
    #34083077
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется библиотека, экспортирующая ф-ию:

Код: plaintext
1.
2.
3.
__declspec(dllexport) void __stdcall a(char **out) {
  *out = _strdup("some text");
}

Есть код, использующий эту ф-ию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __stdcall a(char **out);

void b() {
  char *buf;
  a(&buf);
  delete[] buf;
}

Почему при очистке буфера в функции b возникает ошибка (_CrtIsValidHeapPointer...)?

Причем, если функция а статически прилинкована, то ошибки, естественно, не возникает.
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083123
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разные области памяти. Указатель на выделяемую память не __stdcall ( :) ).
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083171
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал и __cdecl

Гугл сразу выдал:
_CrtIsValidHeapPointer (CRT)Verifies that a specified pointer is in the local heap (debug version only).

Я проверил - под release версией ошибки не случается.
Не понимаю пока как разрулить. Может попробовать GlobalHeap?
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083260
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С GlobalAlloc и GlobalFree работает как часы :)
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083316
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuntНе понимаю пока как разрулить. Может попробовать GlobalHeap?

Может будет более правельным вариантом передавать память в функцию или изменить структуру использовав каллбаки, и очищая в своей dll?
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083361
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh FuntНе понимаю пока как разрулить. Может попробовать GlobalHeap?

Может будет более правельным вариантом передавать память в функцию или изменить структуру использовав каллбаки, и очищая в своей dll?

Передавать уже аллоцированную память не хочется, так как заранее не известен размер данных, а его вычисление сопоставимо с получением самих данных.
Про коллбэки подумаю, а пока буду юзать HeapAlloc и HeapFree
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34083848
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо с dynamic rtl компилировать и свою dll и использующий ее код (причем одинаковым компилятором).
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34084191
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneНадо с dynamic rtl компилировать и свою dll и использующий ее код (причем одинаковым компилятором).
Это, по всей видимости, относится к продукции Borland?
Я использую Visual Studio

Используя HeapAlloc и HeapFree, столкнулся еще с одной проблемой. Код в DLL
Код: plaintext
1.
2.
3.
4.
if (NULL == buf)
  buf = HeapAlloc(GetProcessHeap(),  0 , dwRead);
else
  buf = HeapReAlloc(GetProcessHeap(),  0 , buf, dwAllRead + dwRead);
На HeapReAlloc функция "падает". И непонятно почему.

Если этот же код использовать без DLL, то все проходит. Может быть куча в DLL не может расти?
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34084298
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я же
Используя HeapAlloc и HeapFree, столкнулся еще с одной проблемой. Код в DLL
Код: plaintext
1.
2.
3.
4.
if (NULL == buf)
  buf = HeapAlloc(GetProcessHeap(),  0 , dwRead);
else
  buf = HeapReAlloc(GetProcessHeap(),  0 , buf, dwAllRead + dwRead);
На HeapReAlloc функция "падает". И непонятно почему.

Если этот же код использовать без DLL, то все проходит. Может быть куча в DLL не может расти?

Все, вопрос снимается.
Буфер пополнялся с помощью
_tcscpy(szAllBuf + dwAllRead, buf);
а надо было:
memcpy(szAllBuf + dwAllRead, buf, dwRead);
Получается, что strcpy делает что-то с буфером, что становится невозможным использовать realloc!
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34084477
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funt BarloneНадо с dynamic rtl компилировать и свою dll и использующий ее код (причем одинаковым компилятором).
Это, по всей видимости, относится к продукции Borland?
Я использую Visual Studio
Не, в Visual Studio это в настройках проекта С/С++ -> Code Generation -> Use run-time library -> Multitreaded dll (в 6 версии, в других ищите где)
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34084543
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barlone Funt BarloneНадо с dynamic rtl компилировать и свою dll и использующий ее код (причем одинаковым компилятором).
Это, по всей видимости, относится к продукции Borland?
Я использую Visual Studio
Не, в Visual Studio это в настройках проекта С/С++ -> Code Generation -> Use run-time library -> Multitreaded dll (в 6 версии, в других ищите где)
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34084566
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 8-ке у меня стоит Multi-threaded (/MT)
Если поставить Multi-threaded DLL (/MD), то скомпилится с MSVCR80.dll и т.д. и т.п.
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34085265
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Память должна выделяться и уничтожаться либо с помощью функций CRTL, либо с помощью С++-сных new/delete. Ну или с помощью функций WinAPI ( или другого API OS). Нельзя выделять память malloc-ом, а освобождать с помощью delete (strdup использует malloc).
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34086478
Funt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivПамять должна выделяться и уничтожаться либо с помощью функций CRTL, либо с помощью С++-сных new/delete. Ну или с помощью функций WinAPI ( или другого API OS). Нельзя выделять память malloc-ом, а освобождать с помощью delete (strdup использует malloc).
Это безусловно. Там в первом посте ошибка по поводу delete. С функцией free - аналогично.
Немного погуглив, нашел ту же проблему и советы использовать heap functions вместо CRT (например, на CodeGuru Assertion _CrtIsValidHeapPointer(pUserData)
...
Рейтинг: 0 / 0
Выделение памяти в вызываемой функции. В DLL
    #34087408
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда просто у тебя DLL и .EXE используют две разные DLL для CRTL. А должна быть одна.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти в вызываемой функции. В DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]