簡體   English   中英

帶有觀察者指針的共享指針

[英]Shared pointer with observer pointers

我有一個類Foo,它有一些大類的向量。 這個想法是,八進制樹將以向量的元素遞歸地構建,並且每個OctreeNode將具有指向Foo中找到的向量的少數元素的指針。 (在示例中,為簡單起見,節點將僅指向向量的一個元素)

class Foo
{
    vector<LargeClass>  mLargeClasses;

    void removeItem(const int index);    //remove an element from the vector at the index
}

class OctreeNode
{
    LargeClass* mLargeClass;
}

可以說,“為什么在構建樹之后保留向量,並將對象存儲在樹本身中”。 是的,我只想說,我需要保持矢量與構建的樹平行。

雖然上述概念有效,但是當從底層向量中刪除元素時,我遇到了問題。 在這種情況下,一些八叉樹節點最終會出現懸空指針。

我的解決方案#1:如果調用removeItem函數,那么在它移除向量元素之前,它首先遞歸遍歷八進制樹,並使所有mLargeClass指針成為偶然指向該特定向量元素的nullptr。 可以在節點中使用nullptr,因為我每次都會檢查nullptr,無論如何我都會訪問它們。

我的解決方案#2:讓vector存儲shared_ptrs ,並讓OctreeNode存儲一個weak_ptr 我不喜歡這個,因為每次我訪問樹中的weak_ptr時,它會在后台轉換為shared_ptr ,並且所有原子計數器都會增加。 我不是性能測試的專家,但我有一種感覺,它比使用if條件的簡單指針訪問慢。

有人知道更好的解決方案嗎?

我認為最優雅的是:要有智能指針,其行為類似於shared_pointer ,計數,有多少其他指針引用它,保留它們的記錄,如果它被破壞,它會自動將所有其他“觀察者”歸零指向它的指針?

雖然這個領域和目的有些不同,但我想我會嘗試一下這個端口中描述的句柄系統: 簡單,高效的弱指針,當目標內存被釋放時設置為NULL如果我失敗了,我會回復到shared_ptr / weak_ptr二重奏。 在同一篇文章中描述。

暫無
暫無

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

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