2017-04-14 103 views
-1

什麼是最習慣的方式來轉換它?C++ std :: array到shared_ptr的向量

std::array<SomeType,SIZE> arr; 

std::vector<shared_ptr<SomeType>> vec; // <--- want to fill with pointers 
             //  to items in arr 

第二個問題 - 是否有可能在創建shared_ptr到對象的堆棧分配array?一旦vec被銷燬,指針目標是否會「釋放」?

編輯

我需要的是這樣的

class Element { 
    Element *next; 
} 

class Group { 
    std::vector<Element*> elems; 
} 

int main() { 
    ... 

    std::array<Element,10> elems = {...}; 
    std::array<Group,4> groups = {...}; 

    // shuffle elems and assign to groups; set next-pointers in elems: 
    // group1: &elem10 
    // group2: &elem8 &elem5 
    // group3: &elem2 &elem7 &elem3 
    // group4: &elem4 &elem9 &elem1 &elem6 

    // at some point: 
    // save or load all elems and groups, 
    // preserving pointers elem->elem, group->elem 
} 
+0

你介意'arr'中的對象是否被移動或複製? –

+0

@RichardHodges我認爲OP希望指向'arr'內的項,而不是指向'arr'中對象副本的對象的指針。 – Holt

+0

你是指「釋放」指針目標是什麼意思?你不能「釋放」非動態分配的內存。 – Holt

回答

2

如果你想有一個shared_ptr到一個對象,那麼你應該確保該對象確實是由shared_ptr管理。玩這個遊戲很危險,可能導致未定義的行爲。在你的情況下,訣竅是用shared_ptr管理陣列本身。這將讓你檢索到任何元素的有效shared_ptr

auto elems = std::make_shared<std::array<Element,10>>(); 

然後可以使用shared_ptr的混疊構造函數來創建shared_ptrs到單個元素。如果你想堅持的vector那些shared_ptrs,你可以做這樣的事情:

std::vector<std::shared_ptr<Element>> v; 
v.reserve(elems->size()); 

std::transform(
    elems->begin(), 
    elems->end(), 
    std::back_inserter(v), 
    [&elems] (Element& e) { return std::shared_ptr<Element>{ elems, &e }; }); 

注意,一個(可能是無意的)的這個結果是你的整個元素陣列將繼續只要你有存在一個shared_ptr給其成員之一。

+1

正確的答案,但操作不太可能知道爲什麼。 +1 –

相關問題