簡體   English   中英

shared_ptr完全在堆棧上

[英]shared_ptr entirely on stack

假設我知道堆棧幀將比shared_ptr所有副本更長,有沒有辦法為堆棧對象創建一個shared_ptr ,這樣引用計數器也在堆棧上,這樣在任何時候都沒有動態分配?

例如

SomeObject anObject;
std::shared_ptr::ref_counter refCounter; // Does this exist?

std::shared_ptr<SomeObject>(&anObject, &refCounter, [](SomeObject* obj){
    obj->DoSomething();
});

這里的目標是使用shared_ptr進行引用計數而不是智能指針。

編輯:我將添加更多解釋,以便更清楚地說明這一點。

我正在嘗試創建一個調用函數的標記,當它正在編寫的線程庫中銷毀它的所有副本時。 每個標記本質上只是一個指向持久化對象的智能指針的包裝器,該持久化對象保存該函數並在其析構函數中調用它。 復制令牌會復制包裝器(以及智能指針),但不會復制持久對象。

鑒於這些令牌可以傳遞給許多不同的線程,持久對象通常需要在堆上,但有時我可以保證特定的堆棧幀將比它創建的任何令牌的所有副本都活得更長。 在這些情況下,可以在堆棧上創建令牌的持久部分,從而放棄任何昂貴的堆分配。

所以在某些情況下,智能指針確實需要擁有它所指向的對象,但在其他情況下則不需要。

無法使用共享指針管理堆棧分配的對象。

但是,也不應該有任何需要。 代替共享指針,您可以使用裸指針或引用。 既然您知道引用的對象將比所有用戶都活躍,那么它是安全的。


我正在嘗試創建一個令牌,當它及其所有副本被銷毀時調用該函數

為此,您不想使用共享指針。 您應該只實現自己的參考計數器。

你可以做到這一點,但這不是一個好的選擇*。


SomeObject anObject;
std::shared_ptr<SomeObject>(&anObject, [](auto x){}});

coliru的例子


*這不使用shared_ptr大多數功能而且是浪費,並且可以通過許多其他方式記錄計數,包括實現您自己的計數類。


我真的認為沒有理由阻止動態分配。 即使您不能使用堆,動態分配也可以在堆棧上完全發生。

暫無
暫無

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

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