2016-11-18 127 views
-1

我有一個組中的所有指向相同的對象共享指針。在某個時刻,我希望這些指針離開第一個對象(應該被銷燬),並且都開始指向另一個對象。我只能訪問其中的一個指針,我不知道如何去做。如何更改由一組共享指針指向的對象?

一個例子:

using Ptr = shared_ptr<int>; 

void switch_all(Ptr &p) { 
    p.reset(new int(14)); 
} 

int main() { 
    Ptr a(new int(12)); 
    Ptr b = a; 
    Ptr c(a); 

    cout << "Initial situation: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *b.get() << '\t' << b.get() << endl; 
    cout << *c.get() << '\t' << c.get() << endl; 

    switch_all(c); 

    cout << "After reset: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *b.get() << '\t' << b.get() << endl; 
    cout << *c.get() << '\t' << c.get() << endl; 
} 

此輸出

Initial situation: 
12  0xb8797038 
12  0xb8797038 
12  0xb8797038 
After reset: 
12  0xb8797038 
12  0xb8797038 
14  0xb8797468 

我想要做的是改變switch_all的方式,輸出變爲

Initial situation: 
12  0xb8797038 
12  0xb8797038 
12  0xb8797038 
After reset: 
14  0xb8797468 
14  0xb8797468 
14  0xb8797468 

這可能嗎?怎麼樣?

回答

1

您無法重置由給定shared_ptr舉行的指針,並有其他shared_ptr情況下自動拿起新指針。這根本不是如何shared_ptr的作品。當多個shared_ptr實例擁有相同的指針時,它們遞增與該指針關聯的引用計數。重置shared_ptr實例中的一個將簡單地減少引用計數,其他shared_ptr實例與先前的指針保持一致,而復位shared_ptr現在保存新的指針。這是shared_ptr的全部要點,只要存在活動引用即可保持給定的指針處於活動狀態。

你所要求的,需要額外的間接級別,例如:

using UPtr = unique_ptr<int>; 

void switch_all(UPtr &p) { 
    p.reset(new int(14)); 
} 

int main() { 
    UPtr a(new int(12)); 
    UPtr &b = a; 
    UPtr &c = a; 

    cout << "Initial situation: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *b.get() << '\t' << b.get() << endl; 
    cout << *c.get() << '\t' << c.get() << endl; 

    switch_all(c); 

    cout << "After reset: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *b.get() << '\t' << b.get() << endl; 
    cout << *c.get() << '\t' << c.get() << endl; 
} 

或者

using UPtr = unique_ptr<int>; 

void switch_all(UPtr *p) { 
    p->reset(new int(14)); 
} 

int main() { 
    UPtr a(new int(12)); 
    UPtr *b = &a; 
    UPtr *c = &a; 

    cout << "Initial situation: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *(b->get()) << '\t' << b->get() << endl; 
    cout << *(c->get()) << '\t' << c->get() << endl; 

    switch_all(c); 

    cout << "After reset: " << endl; 
    cout << *a.get() << '\t' << a.get() << endl; 
    cout << *(b->get()) << '\t' << b->get() << endl; 
    cout << *(c->get()) << '\t' << c->get() << endl; 
} 
+0

我希望有一種方法來改變由管理對象存儲的指針,所以所有指向該管理器對象的共享指針現在指向一個不同的管理對象。猜猜我必須從頭開始設計一個shared_ptr類。 – user6245072

相關問題