2

我在返回这个 const 指针时遇到了问题。使用调试器向我展示了场景已正确导入并存储在变量场景中。返回scene后,scene指向的内容丢失,调用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++ 中处理这样的问题?

4

3 回答 3

7

您忘记阅读文档了。

该场景由 拥有Importer,因此当超出范围时它将被销毁。返回importer.GetOrphanedScene()获得所有权,并记住在完成后将其删除。

或者,您可以将进口商存储在更永久的地方;但如果您需要同时导入和使用多个场景,这可能效果不佳。

于 2013-05-28T18:32:21.753 回答
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.
}
于 2013-05-28T18:28:33.217 回答
0

我的猜测是Assimp::Importer拥有返回的资源ReadFile,所以当importer超出范围时,资源(内存)被释放,你最终返回一个悬空指针。您可以通过参数传递它,或者使其static在函数范围之外持续存在,或者scene动态分配,复制返回的内容ReadFile-

const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace      |
aiProcess_Triangulate           |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));
于 2013-05-28T18:28:53.093 回答