С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 721

Куча в DLL и EXE

09.02.2018, 01:16. Показов 1595. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Важно понимать, что единое адресное пространство состоит из одного исполняемого модуля и нескольких DLL-модулей. Одни из них могут быть скомпонованы со статически подключаемой библиотекой С/С++, другие — с DLL-версией той же библиотеки, а третьи (написанные нс на С/С++) вообще ею не пользуются Многие разработчики допускают ошибку, забывая, что в одном адресном пространстве может одновременно находиться несколько библиотек С/С++. Взгляните на этот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
VOID EXEFunc()
{
 
PVOID pv = DLLFunc();
 
// обращаемся к памяти, на которую указывает pv;
// предполагаем, что pv находится в С/С++-куче ЕХЕ-файла
 
free(pv);
 
}
 
PVOID DLLFunc()
{
 
// выделяем блок в С/С++-куче DLL return(malloc(100));
 
}
Ну и что Вы думаете? Будет ли этот код правильно работать? Освободит ли ЕХЕ-функция блок, выделенный DLL-функцией? Ответы на все вопросы одинаковы- может быть Для точных ответов информации слишком мало. Если оба модуля (EXE и DLL) скомпонованы с DLL-версией библиотеки С/С++, код будет работать совершенно нормально. По ссли хотя бы один из модулей связан со статической библиотекой С/С++, вызов free окажется неудачным. Я нс раз видел, как разработчики обжигались на подобном коде.
Что-то не понимаю - почему куча exe и dll разная, ведь адресное пространство процесса одно?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2018, 01:16
Ответы с готовыми решениями:

Переносимость программы, куча dll и кроссплатформенность
Решил пощупать С++ и Qt после C#. Создал простейшее консольное приложение и оконное Qt. В итоге, что бы приложение открылось вне IDE...

Dll файл в exe файле. Вшить dll libcurl
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все носить в одном exe. Enigma Virtual Box использовать нельзя,...

[C++] dll в exe
Как можно сделать так чтобы dll засунуть в exe программу чтоб при запуске она инжектилась в процесс hl.exe

3
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
09.02.2018, 01:57
AndrSlav, ради експеримента, сделай 3 файла и назови 1.сpp 2.cpp 3.cpp.

1.cpp собери как статическую либу
2.сpp при линковке добавь либу 1 и собери как динамическую библиотеку
3.cpp загрузи либу 2 и посмотри что выйдет
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.02.2018, 08:34
Цитата Сообщение от AndrSlav Посмотреть сообщение
хотя бы один из модулей связан со статической библиотекой С/С++
Здесь имеется в виду статически связанный runtime c++. Когда в dll свой статический runtime (и, следовательно, свой менеджер кучи), а в exe - свой. В этом случае выделенная на стороне dll динамическая память будет неизвестна менеджеру кучи exe, и попытка освободить ее с его помощью скорее всего приведет к аварийному останову.

Причем я бы сказал, что сама по себе линковка dll со статической версией runtime не приводит к проблемам. К проблемам приводит факт передачи владения в exe выделенной памяти на строне dll или наоборот. Поэтому нормальные библиотеки, если отдают пользователю dll какую-то память, то предусматривают также функции ее освобождения, реализованные на их стороне.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.02.2018, 11:11
Цитата Сообщение от AndrSlav Посмотреть сообщение
Что-то не понимаю - почему куча exe и dll разная, ведь адресное пространство процесса одно?
В переводе с авторского на человеческий - "Совместимость ABI в разных DLL-ках никто не обещал, если конечно обратное не написано в документации прямо. Даже если все DLL-ки написаны на одном языке".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2018, 11:11
Помогаю со студенческими работами здесь

Встроить dll в exe
Создал простое окно в WinAPI, однако у пользователей у которых не стоит вижуал студио, требует msvcp120.dll Можно её как-то встроить в...

Внедрение DLL в EXE
Здравствуйте, хочу написать свой объединитель exe и dll. Подскажите, как это можно сделать так, чтобы можно было при запуске использовать...

Dll и exe в одном файле
Здравствуйте! Можно ли добавить свою dll в файл exe так чтобы при компиляции получился один файл. И при переносе не надо было таскать...

Редактировании файла .DLL и .exe
Доброго времени суток дорогие форумчане! Прошу прощение если я ошибся разделом (перенесите пож.) :sorry: В общем нужно отредактировать...

Модули. Ассоциативный массив. (DLL, EXE)
Добрый день, нужна помощь в следующем задании: написать программу. программа состоит из двух модулей (не понимаю, как они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru