簡體   English   中英

用靜態或全局對象初始化共享指針

[英]initializing a shared pointer with a static or global object

以下代碼顯示使用全局或靜態對象的地址初始化共享對象不正確,因為當共享指針超出范圍時,將刪除全局對象。

class Dog() {
public:
    void bark() {
        cout << "Dog barks" << endl;
    }
};
Dog g_Dog;
void test() {
    shared_ptr<Dog> myDog(&g_Dog);
    myDog->bark();
}
int main() {

    test();

}

上面的代碼崩潰。 我的理解是我們不應使用靜態或全局對象初始化共享指針,而應僅使用堆中的對象初始化共享指針。 那是對的嗎 ?

我在Boost Log教程( https://www.boost.org/doc/libs/develop/libs/log/doc/html/log/tutorial/sinks.html )中看到了以下代碼片段

#include <boost/core/null_deleter.hpp>

// We have to provide an empty deleter to avoid destroying the global stream object
boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
sink->locked_backend()->add_stream(stream);

你們能解釋為什么代碼

  boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter()); 

不會造成任何問題。 它看起來像std :: clog是一個整體或靜態變量。 是不是 當上述流共享指針超出范圍時,為什么不構成被銷毀的風險? 請說明一下。 謝謝

從鏈接null_deleter :boost :: null_deleter函數對象可以用作帶有智能指針(例如unique_ptr或shared_ptr)的刪除器。 刪除器對釋放后提供的指針不執行任何操作,這在將指向對象釋放到其他位置時非常有用。

換句話說,使用null_deleter,智能指針將永遠不會嘗試刪除指向的對象。

如果您提供不會試圖銷毀和釋放它的刪除器,那是合法的。

shared_ptr帶有兩個參數(請參閱文檔 ):地址和刪除器。 Deleter參數是可選的。

默認的刪除器(即,當您不顯式提供刪除器時使用的刪除器)會破壞對象並釋放堆,因此它顯然不適用於堆上沒有的任何對象。

有兩種選擇:

  1. 使用nop-deleter。 只需接受該虛假控制塊的開銷即可。

  2. 使用別名構造函數。 std::weak_ptr不能使用。
    請參閱“ 將C ++共享指針的別名構造函數與空的共享指針一起使用 ”。

暫無
暫無

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

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