C++ 函数返回后指向无效内容的指针寻址
返回此常量指针时遇到问题。使用调试器向我展示了场景已正确导入并存储在变量scene中。返回场景后,场景所指向的内容将丢失,并且调用loadData()的类无法访问该内容 (C++ 函数返回后指向无效内容的指针寻址,c++,assimp,C++,Assimp,返回此常量指针时遇到问题。使用调试器向我展示了场景已正确导入并存储在变量scene中。返回场景后,场景所指向的内容将丢失,并且调用loadData()的类无法访问该内容 (Importer和aiScene(struct)是assimp库的一部分,不能修改) 我假设场景存储在堆栈上,返回调用重置堆栈指针,内容丢失。如何处理C++中的问题? < p>你误解了这个问题。问题不在于指针是本地的&被破坏了。问题是,Assimp::Importer的析构函数会破坏指针指向的内容。由于Assimp::Impo
Importer
和aiScene(struct)
是assimp库的一部分,不能修改)
我假设场景存储在堆栈上,返回调用重置堆栈指针,内容丢失。如何处理C++中的问题? < p>你误解了这个问题。问题不在于指针是本地的&被破坏了。问题是,
Assimp::Importer
的析构函数会破坏指针指向的内容。由于Assimp::Importer
对象在函数末尾被销毁,指针现在指向无效内容
为什么需要loadData
功能?为什么不按照这里的建议使用ReadFile
或者,问题的解决方案是确保在您使用aiScene
之前,Importer
对象不会超出范围
一种可能的方法是将导入器对象作为加载数据方法的参数
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.
}
我的猜测是,
Assimp::Importer
拥有由ReadFile
返回的资源,因此当Importer
超出范围时,资源(内存)被释放,最终返回一个悬空指针。您可以通过参数传递它,或使其静态
,使其持续超出功能范围,或动态分配场景
,复制读取文件
返回的内容-
const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));
你忘了看报纸了
该场景属于导入程序
,因此超出范围时将被销毁。返回以获取所有权,并记住在完成后将其删除
或者,您可以将进口商存放在更永久的地方;但是,如果您需要同时导入和使用多个场景,这可能不太好。@mikeseymour是否可以将此场景写入文件?为了节省运行时间?@Amourreux:我不使用这个库,但这大概就是它的用途。@MikeSeymour你能看看我的吗
const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));