ImGUI拖拽自定义Texture::data数据获取异常问题求助
问题分析与修复
核心错误:接收端的Payload数据访问方式完全错误
你在接收拖拽数据时,错误地将ImGuiPayload*指针的地址当成了数据地址,而正确的做法是访问ImGuiPayload结构体的Data成员——这才是你通过SetDragDropPayload传入的数据指针。
你的接收端代码中:
auto* f = (Texture::data *) &x;
这行代码把ImGuiPayload*类型的x的地址强制转换成了Texture::data*,相当于读取了指针变量本身的内存值,自然得到异常的乱码数值。
修正后的接收端代码
ImGui::Image((void*)2, ImVec2{windowSize.x, windowSize.y}, {0, 1}, {1, 0}); if (ImGui::BeginDragDropTarget()) { const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("TEXTURE"); if (payload) { // 直接访问payload->Data获取拖拽的数据指针 const Texture::data* dropped_tex = static_cast<const Texture::data*>(payload->Data); std::cout << "DROPPED TEX: " << dropped_tex->ID << '\n'; } ImGui::EndDragDropTarget(); }
额外注意事项
- 发送端参数验证:确保
text确实是Texture::data类型,且sizeof(Texture::data)传入的大小准确匹配结构体实际大小。 - 数据生命周期:拖拽操作是跨帧的,要保证
&text指向的内存在拖拽完成前始终有效。如果texts是局部栈变量,拖拽过程中该内存可能被释放,导致访问非法内存。建议将纹理数据存储在全局容器、类成员变量等生命周期足够长的位置。 - 类型安全:尽量使用
static_cast而非C风格强制转换,避免潜在的类型转换错误。
内容的提问来源于stack exchange,提问作者notfynnaf
相关产品推荐
相关产品推荐

