函数返回后指向无效内容的指针

时间:2013-05-28 18:19:49

标签: c++ assimp

我遇到了返回此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;
}

ImporteraiScene(struct)是assimp库的一部分,无法修改)

我假设场景存储在堆栈中,返回调用重置堆栈指针并且内容丢失。如何在c ++中处理这样的问题?

3 个答案:

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