[英]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;
}
( Importer
和aiScene(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.