簡體   English   中英

函數返回后指向無效內容的指針

[英]Pointer addressing to invalid content after function return

我有一個返回這個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 ++中處理這樣的問題?

你忘了閱讀文檔

該場景由Importer擁有,因此當它超出范圍時將被銷毀。 返回importer.GetOrphanedScene()獲取所有權,並記得在完成后刪除它。

或者,您可以將導入器存儲在更永久的位置; 但如果您需要同時導入和使用許多場景,那可能效果不佳。

你誤解了這個問題。 問題不在於指針是本地的並且被破壞了。 問題是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.
}

我的猜測是Assimp::Importer擁有ReadFile返回的資源,所以當importer超出范圍時,資源(內存)被釋放,你最終返回一個懸空指針。 您可以通過參數傳遞它,或使其保持static以便它超出函數范圍,或動態分配scene ,復制ReadFile返回的內容 -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM