Как использовать одну и ту же кучу для DLL и EXE в Visual C ++ - PullRequest
0 голосов
/ 13 октября 2019

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

Как я понял, разные кучи DLL и EXE вызывают это. Посмотрите на скриншот: enter image description here

Мне нужен объект в квадратных скобках, но я не могу получить к нему доступ из приложения. Та же история для DLL.

Как мне сделать так, чтобы она использовала одну и ту же кучу или получала прямой доступ к этим объектам?

В linux или mac нет таких ошибок, когда я 'Я создаю общие библиотеки и использую их в приложении. Просто в Windows я не знаю, как заставить его нормально работать. Я уверен, что использование статических библиотек не очень хорошо в этом случае, но я должен найти решение, как заставить его работать спокойно.

Код, где происходит ошибка (это еще один пример, который яОшибка выше возникает, когда я получаю объект из этой иерархии, он существует, но в разных мирах):

if (EditorInstance::GetSingleton()->currentScene->hierarchy->empty())

Где иерархия:

boost::container::list<GameObject*>

in Scene class.

Я инициализирую список в конструкторе, но когда я пытаюсь использовать его в приложении, он не инициализируется. Хак, который частично решил эту проблему - это getter, который возвращает иерархию: GetHierarchy (). Но для всего объекта такого взлома нет ...

Теперь я могу получить объект из иерархии, но, как показано на скриншоте, он указывает на 2 разных объекта, один из которых определен, как я, и доступен изDLL, и та, которая не определена (я могу определить ее непосредственно перед использованием в приложении, в противном случае она будет существовать только для объектов DLL.) Объект DLL находится в квадратных скобках, объект приложения - root.

1 Ответ

0 голосов
/ 27 октября 2019

Основная моя ошибка заключалась в том, что я выдвинул список указателя на объект, который был уничтожен позже (GC?).

Я создал этот объект под предикатом и после выхода из if он был очищен, а указатель, который я передал в список, был стерт.

if(something){
    GameObject* newObject = new GameObject();
    ...
    hierarchy.push_back(newObject);
}

Это правильно?

...