我可能有這個錯誤的一些方面,這實際上是我第一次特別用共享指針進行處理。確保向量中的共享指針被正確推回
我正在穿越一棵樹。我的樹由一個鏈表組成,其中有一個共享指針向量,代表每個節點的所有子對象。要遍歷,我(與開始)試圖做到這一點:
//--------------------------------------------------------------
void setupMesh(){
Mesh mesh;
shared_ptr<Mesh> shared_mesh(&mesh);
meshes.push_back(shared_mesh);
checkChildren(root, &temp_mesh);
}
//--------------------------------------------------------------
void checkChildren(Node * temp_node, Mesh * temp_mesh){
if(!temp_node->children.empty()){
for(int i = 0; i < temp_node->children.size(); i++){
if(i > 0){
shared_ptr<Mesh> new_mesh(new Mesh);
meshes.push_back(new_mesh);
}
temp_node = temp_node->children[0].get();
checkChildren(temp_child, temp_mesh);
}
}
}
我的樹結構本身似乎不錯,但它與我如何穿越它,以及如何我跟蹤的更多問題指針。它目前正在返回錯誤的訪問錯誤。從我可以告訴,它看起來像我插入一個指向臨時對象,temp_node,和temp_mesh的指針。
爲了簡化這一過程我想到:通過屬於節點[0](根)的所有兒童
環路。 對於每個孩子,對他們執行相同的循環。如果孩子是[0]孩子,繼續添加它的座標到同一個temp_mesh對象,但如果它是另一個孩子,創建一個新的網格來存儲它,並且它的所有第一個孩子。 任何新的網格應該有一個指針推回到網格矢量(vector>)。
有沒有人有關如何更有效地做到這一點,或者我在處理內存中的這些指針時出錯的建議。
請將[編輯]下拉到[mcve],而不是(看上去像)完整的代碼 - 即刪除無關的代碼,直到獲得最短可讀的,可編譯的代碼位來展示問題。 –
希望現在就足夠了! – aceslowman
(這是一個有爭議的問題,因爲有人回答,但爲了完整:)非常接近!添加一個包含_just_的'main'和'Node'和'Mesh'的定義,足以複製該問題。它需要完成 - 也就是說,如果我將您提供的代碼複製/粘貼到我的編輯器中,它會編譯,運行並演示此問題。我在第一條評論中鏈接的文章給出了比以往更好的描述。 –