Ошибка отладки - debug_heap. cpp: 996 - PullRequest
0 голосов
/ 01 мая 2020

Я использую Visual Studio 2017. У меня есть мультипроектное решение (c ++). Есть проект, который создает исполняемый файл (основное приложение) и проекты, которые создают динамические c библиотеки (плагины). Базовое приложение загружает плагины во время выполнения, используя функции LoadLibrary и GetProcAddress. Базовое приложение определяет объект, который содержит карту, вот упрощенное определение:

class T
{
public:
    void fun(const std::string& key)
    {
        ++data_[key];
    }
private:
    std::map<std::string, int> data_;
};

T объект статически определяется в базовом приложении и регистрируется в плагине (через указатель), который использует его следующим образом:

void Plugin::fun()
{
    t->fun(key);
}

Распределение памяти происходит, когда плагин вызывает функцию, но освобождение выполняется в основном приложении. Это приводит к следующей ошибке после закрытия приложения:

enter image description here

Эта ошибка отсутствует, когда я использую объект T только из основного приложения. У меня есть нашел похожий topi c но там сообщение об ошибке немного отличается. Свойство генерации кода для основного приложения и плагина выглядит следующим образом:

enter image description here

Что означает, что для записи Runtime Library установлено значение different options жирным шрифтом? Как мне установить Runtime Library в основном приложении и плагине, чтобы решить проблему?

1 Ответ

1 голос
/ 01 мая 2020

Чтобы увидеть, какую библиотеку времени выполнения вы на самом деле используете, вам нужно выбрать только одну платформу и конфигурацию (для которой вы строите) из выпадающих. Библиотека времени выполнения должна быть многопоточной DLL (или многопоточной DLL отладки для сборок отладки) как для вашего приложения, так и для вашего плагина, и конфигурация, для которой вы создаете (Debug или Release), также должна совпадать.

Распределение памяти происходит, когда плагин вызывает функцию, но освобождение выполняется в основном приложении.

Это fr agile. Я бы порекомендовал как распределять, так и освобождать в плагине или в приложении в обоих случаях, если вы можете это организовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...