Прошу помощи в реализации правильного освобождения памяти в библиотеке 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 неверно. Как это исправить?
Мое текущее решение основано на: