Удалить экземпляр класса из DLL - PullRequest
0 голосов
/ 20 февраля 2020

Прошу помощи в реализации правильного освобождения памяти в библиотеке dll.

Структура моего проекта выглядит следующим образом:

Library.dll:

  • interface.h -> определение базового класса с использованием чисто виртуальных методов
  • creation.h -> производный класс, наследующий от реализации publi c base
  • . cpp -> производный Определение методов класса

creation.h содержит также экспортируемые функции:

extern "C" __declspec(dllexport) Base* __stdcall Create()
{
    return new Derived;
}

extern "C" __declspec(dllexport) void __stdcall Delete(Base* B)
{
    delete B;
}

Код Apllication.exe выглядит следующим образом:

#include "interface.h"
#include "windows.h"
#include <iostream>
#include <memory>

typedef Base* (*CREATE_BASE)();
std::unique_ptr<Base> SmartPointer;

int main()
{
    // Load the DLL
    HINSTANCE dll_handle = ::LoadLibrary(TEXT("Library.dll"));
    if (!dll_handle) {
        std::cout << "Unable to load DLL!\n";
        return 1;
    }

    // Get the function from the DLL
    CREATE_BASE Fn = (CREATE_BASE)GetProcAddress(dll_handle, "Create");
    if (!Fn) {
        std::cout << "Unable to load Create from DLL!\n";
        ::FreeLibrary(dll_handle);
        return 1;
    }

// i have possibility to use only C++11 so creation of unique_ptr looks like this:
SmartPointer = std::unique_ptr<Base>(Fn());

// ... do something like SmartPointer->Action();
::FreeLibrary(dll_handle);
return 0;
}

Приведенный выше код работает и я могу легко инициализировать объект Base и выполнять функции из класса Derived. Теперь я хотел бы использовать экспортированную функцию "Delete" в качестве пользовательского указателя удаления. Поэтому я подготовил определение типа:

typedef void (*DELETE_BASE)(Base* B);

, и я хотел бы использовать его более или менее так:

DELETE_BASE DeleteFn=(DELETE_BASE)GetProcAddress(dll_handle,"Delete");
SmartPointer = std::unique_ptr<Base>(Fn(),DeleteFn);

Однако я получаю ошибка компилятора, что это определение unique_ptr неверно. Как это исправить?

Мое текущее решение основано на:

1 Ответ

1 голос
/ 20 февраля 2020

Тип функции удаления должен быть указан, поскольку вы хотите переопределить средство удаления по умолчанию (см. std :: unique_ptr <> ).

Где вы использовали:

std::unique_ptr<Base>

вместо этого вы хотели бы использовать:

std::unique_ptr<Base, DELETE_BASE>
...