我遇到了返回此const指针的问题。使用调试器向我显示场景已正确导入并存储在变量场景中。返回场景后,场景指向的内容丢失,调用loadData()的类无法访问。
const aiScene* IOHandler::loadData(const std::string& pFile){
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
return scene;
}
(Importer
和aiScene(struct)
是assimp库的一部分,无法修改)
我假设场景存储在堆栈中,返回调用重置堆栈指针并且内容丢失。如何在c ++中处理这样的问题?
答案 0 :(得分:4)
您忘了阅读documentation。
该场景由Importer
拥有,因此当它超出范围时将被销毁。返回importer.GetOrphanedScene()
取得所有权,并记得在完成后将其删除。
或者,您可以将导入器存储在更永久的位置;但如果您需要同时导入和使用许多场景,那可能效果不太好。
答案 1 :(得分:0)
你误解了这个问题。问题不在于指针是本地的&被摧毁。问题是Assimp::Importer
的析构函数会破坏指针指向的内容。由于Assimp::Importer
对象在函数末尾被销毁,指针现在指向无效的东西。
为什么需要loadData
功能?为什么不按照此处的建议使用ReadFile
- http://assimp.sourceforge.net/lib_html/usage.html
或者,问题的解决方案是确保Importer
对象不会超出范围,直到您使用aiScene
完成。
一种可能的方法是 - 将Importer
对象作为loadData
方法的参数。
const aiScene* IOHandler::loadData(Assimp::Importer & importer,
const std::string& pFile)
{
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
return scene;
}
调用代码看起来像这样。
{
........
Assimp::Importer imp;
const aiScene * p = loadData(imp, pFile);
// use aiScene
........
// Importer object goes out of scope here.
}
答案 2 :(得分:0)
我猜是Assimp::Importer
拥有ReadFile
返回的资源,所以当importer
超出范围时,资源(内存)被释放,你最终返回一个悬空指针。您可以通过参数传递它,或使其static
使其保持超出函数范围,或动态分配scene
,复制ReadFile
返回的内容 -
const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));