C++ 函数返回后指向无效内容的指针寻址

C++ 函数返回后指向无效内容的指针寻址,c++,assimp,C++,Assimp,返回此常量指针时遇到问题。使用调试器向我展示了场景已正确导入并存储在变量scene中。返回场景后,场景所指向的内容将丢失,并且调用loadData()的类无法访问该内容 (Importer和aiScene(struct)是assimp库的一部分,不能修改) 我假设场景存储在堆栈上,返回调用重置堆栈指针,内容丢失。如何处理C++中的问题? < p>你误解了这个问题。问题不在于指针是本地的&被破坏了。问题是,Assimp::Importer的析构函数会破坏指针指向的内容。由于Assimp::Impo

返回此常量指针时遇到问题。使用调试器向我展示了场景已正确导入并存储在变量scene中。返回场景后,场景所指向的内容将丢失,并且调用loadData()的类无法访问该内容

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));