从 DLL 中删除 class 的实例
Delete instance of class from DLL
我正在寻求帮助以正确释放 dll 库中的内存。
我的项目结构如下所示:
Library.dll:
- interface.h -> base class 纯虚方法定义
- implementation.h -> 派生 class 继承自 public base
- implementation.cpp -> 派生class 方法定义
implementation.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 class 执行函数。现在我想使用导出的“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 定义不正确。如何解决这个问题?
我目前的解决方案基于:
- How to create a shared_ptr in dll and export it via a factory function?
必须指定删除器函数的类型,因为您要覆盖默认删除器(参考std::unique_ptr<>)。
你用过的地方:
std::unique_ptr<Base>
你会想使用:
std::unique_ptr<Base, DELETE_BASE>
我正在寻求帮助以正确释放 dll 库中的内存。
我的项目结构如下所示:
Library.dll:
- interface.h -> base class 纯虚方法定义
- implementation.h -> 派生 class 继承自 public base
- implementation.cpp -> 派生class 方法定义
implementation.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 class 执行函数。现在我想使用导出的“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 定义不正确。如何解决这个问题?
我目前的解决方案基于:
- How to create a shared_ptr in dll and export it via a factory function?
必须指定删除器函数的类型,因为您要覆盖默认删除器(参考std::unique_ptr<>)。
你用过的地方:
std::unique_ptr<Base>
你会想使用:
std::unique_ptr<Base, DELETE_BASE>