Нарушение доступа, выполняющее местоположение 0x0000 при использовании моего exe-файла из библиотеки dll, которая ссылается на другую библиотеку dll

#c #dll #linker #vulkan

Вопрос:

Вот моя программа.
https://github.com/ILLmew/Seagull-Engine-v2

Короче говоря, это крошечный игровой движок, который я написал, чтобы узнать что-то новое, и вот вопрос:
у меня есть SCore.dll для основных средств и всех других модулей это используется для других целей. Теперь у меня есть СРендерерВулкан.dll, которая ссылается на SCore.dll и мое приложение Sandbox.exe какие ссылки SCore.dll и Срендервулкан.библиотека dll во время загрузки, а не во время выполнения.

Как это показано ниже:

 SCore.dll -------> SRendererVulkan.dll -------> Sandbox.exe  
     |                                               ^
     |                                               |
     -------------------------------------------------  
 

При компиляции в VS2019 в нем нет ошибки компиляции или ошибки ссылки.
И когда я запускаю программу, я ставлю несколько точек останова, чтобы проверить, были ли инициализированы ресурсы для vulkan, и кажется, что вся инициализация прошла успешно, все в порядке. Проверка nullptr не удалась, и это показывает окно. Но когда я закрываю окно и вхожу в стадию завершения работы, оно делает утверждение:
Нарушение доступа, выполняющее местоположение 0x0000000000000000

Я использую premake в качестве инструментов сборки, а все верхние библиотеки DLL ссылаются на eastl.lib и mimalloc.lib.

Я пробую много способов, включая экспорт серверной части SRendererVulkan.dll или экспорт всего класса в VulkanRenderDevice, все они потерпели неудачу.

Я знаю, что это ошибка связывания, но я не могу ее решить, поэтому я пришел сюда и попросил о помощи.

Комментарии:

1. Я сомневаюсь, что это ошибка привязки.

2. В вызове vkDestroyDevice является ли logicalDevice нулевым указателем?

3. Нет, с бэкэндом все в порядке. И я понял, почему это не удалось. Я новый срендервулкан. dll в exe и удалите ее в SCore.dll, поэтому его успешно создавали, но не смогли уничтожить. Моя глупая ошибка.

Ответ №1:

Я новый() СРендерерВулкан.dll в exe — файле и удалите его в SCore.dll. Таким образом, он успешно создан, но не может быть уничтожен. Из-за этой операции возникает сбой при удалении соответствующего блока выделения памяти и, таким образом, приводит к этой ошибке.