2013-05-28 76 views
1

我遇到了返回此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庫的一部分,不能被修改)

我假設場景存儲在堆棧上,返回調用重置的stackpointer和內容丟失。如何在C++中處理這樣的問題?

回答

4

你忘了閱讀documentation

該場景歸Importer所有,所以在超出範圍時將被銷燬。返回importer.GetOrphanedScene()取得所有權,並記得在完成後刪除它。

或者,您可以將導入器存儲在更永久的地方;但如果您需要同時導入和使用多個場景,那麼這可能不會奏效。

+0

非常感謝您的幫助。現在它工作正常。 –

+0

@mikeseymour是否可以將此場景寫入文件?並節省運行時間? –

+1

@Amourreux:我沒有使用庫,但可能這就是['Exporter'](http://assimp.sourceforge.net/lib_html/class_assimp_1_1_exporter.html)的用途。 –

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. 
} 
0

我的猜測是Assimp::Importer擁有由ReadFile返回的資源,所以當importer超出範圍,資源(內存)被釋放,你最終會返回一個懸擺指針。您可以通過參數傳遞,或使其static,使其持續超過函數範圍,或動態分配scene,複製的是什麼ReadFile回報內容 -

const aiScene* scene = new aiScene(*importer.ReadFile(pFile, 
aiProcess_CalcTangentSpace  | 
aiProcess_Triangulate   | 
aiProcess_JoinIdenticalVertices | 
aiProcess_SortByPType)); 
相關問題