如何获取并删除在C++ DLL中创建的CSpeedTreeRT对象?
获取和删除DLL中CSpeedTreeRT对象的方法
根据你提供的DLL导出函数定义,获取和销毁CSpeedTreeRT对象的逻辑已经由DLL本身封装好了,下面是具体的操作步骤和注意事项:
一、获取CSpeedTreeRT对象
DLL导出的NewSpeedTree()函数就是专门用来创建CSpeedTreeRT实例的入口,它会在DLL内部的堆上分配对象内存并返回指针给调用者。
调用方式
1. 静态链接DLL(推荐,如果你有DLL的.lib文件)
首先在调用程序中声明导入这些DLL函数:
#define DllImport extern "C" __declspec( dllimport ) #include "SpeedTreeRT_1_8.h" DllImport CSpeedTreeRT* NewSpeedTree(void); DllImport void DeleteTree(CSpeedTreeRT* handle); DllImport bool LoadTree(CSpeedTreeRT* handle, const unsigned char* pBlock, unsigned int nNumBytes);
然后就可以直接调用函数创建对象:
// 创建树对象 CSpeedTreeRT* pTree = NewSpeedTree(); if (pTree != nullptr) { // 可选:调用LoadTree加载树的二进制数据 // 示例:假设你已经有树数据的缓冲区和字节数 // bool isLoaded = LoadTree(pTree, pTreeDataBuffer, treeDataSize); }
2. 动态加载DLL(无需.lib文件)
如果是动态加载DLL,需要通过LoadLibrary和GetProcAddress获取函数地址:
#include <windows.h> #include "SpeedTreeRT_1_8.h" // 定义函数指针类型 typedef CSpeedTreeRT* (*NewSpeedTreeFunc)(); typedef void (*DeleteTreeFunc)(CSpeedTreeRT*); typedef bool (*LoadTreeFunc)(CSpeedTreeRT*, const unsigned char*, unsigned int); int main() { HMODULE hDll = LoadLibrary(L"YourDllFileName.dll"); if (hDll == nullptr) { // 处理DLL加载失败的情况 return 1; } // 获取函数地址 NewSpeedTreeFunc pNewTree = reinterpret_cast<NewSpeedTreeFunc>(GetProcAddress(hDll, "NewSpeedTree")); DeleteTreeFunc pDeleteTree = reinterpret_cast<DeleteTreeFunc>(GetProcAddress(hDll, "DeleteTree")); if (pNewTree && pDeleteTree) { // 创建对象 CSpeedTreeRT* pTree = pNewTree(); // 使用对象... // 销毁对象 pDeleteTree(pTree); } FreeLibrary(hDll); return 0; }
二、删除CSpeedTreeRT对象
非常重要:必须使用DLL导出的DeleteTree()函数销毁对象,绝对不能直接在调用程序中用delete pTree!
原因是DLL和调用程序可能使用不同的CRT(C运行时库)堆分配器,直接跨堆释放内存会导致程序崩溃或内存泄漏。
调用示例:
if (pTree != nullptr) { DeleteTree(pTree); pTree = nullptr; // 置空指针,避免后续误操作悬空指针 }
三、关键注意事项
- 确保调用程序和DLL使用完全一致的编译器设置:包括Debug/Release模式、多线程/单线程CRT、编译器版本等,否则堆分配器不兼容会引发内存问题。
- 如果使用
LoadTree()加载树数据,要确保传入的二进制数据格式符合SpeedTreeRT_1_8.h的要求,否则加载会失败。
内容的提问来源于stack exchange,提问作者Ales Vidmar
相关产品推荐
相关产品推荐

