[英]Are shared_ptr on static objects good?
我想知道靜態對象上的智能指針是否合理。 例如,假設我有一些靜態資源,並且想將對該靜態資源的引用傳遞給其他需要使用這些資源的對象。
一種方法是使用指向該資源的RAW指針。 但是現在我想知道智能指針(shared_ptr)是否是更好的方法,如果是的話,如何正確地做到這一點。 (智能指針也應該是靜態的嗎?)。
問題的背景:如果不再有任何持有智能指針的對象,則該智能指針指向的靜態對象將被釋放(這不是最好的主意...)。
一個示例(在運行時結束時崩潰):
struct SomeType {
SomeType() { cout << "ctor..." << endl; }
~SomeType() { cout << "dtor..." << endl; }
void sayHello() { cout << "Hello!" << endl; }
};
void someFunction(shared_ptr<SomeType> smartPointer) {
smartPointer->sayHello();
}
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
void anotherFunction() {
someFunction(pt);
}
int main() {
anotherFunction();
cin.get();
}
以下兩行無效。
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
當pt
在您的進程生命周期結束時被銷毀時,它將delete st
。 st
從未分配有匹配的new
。 這是未定義的行為。
shared_ptr
對於管理共享對象的復雜生存期非常有用,而static
對象的生存期非常簡單。 使用shared_ptr
管理static
對象是不正確的,這樣做沒有任何好處。
假設我(作為類作者)不知道對象是靜態的還是動態的
絕對需要不可知的代碼應使用shared_ptr<T>
。
您提供的此代碼無效,因為它會導致刪除具有靜態生存期的對象。
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
很好:
static SomeType st;
static shared_ptr<SomeType> pt{ std::shared_ptr<SomeType>{}, &st };
並且該pt
可以與“普通” shared_ptr實例互換使用。 在這方面, std::shared_ptr
特別方便,因為是否存在刪除器不會影響指針類型(相反, std::unique_ptr<T, custom_deleter<T>>
是與`std不同的類型: :的unique_ptr>)
指定刪除器不執行任何操作的這種方法和其他方法在以下位置進行了描述:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.