You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取并删除在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:42