[英]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參數是可選的。
默認的刪除器(即,當您不顯式提供刪除器時使用的刪除器)會破壞對象並釋放堆,因此它顯然不適用於堆上沒有的任何對象。
有兩種選擇:
使用nop-deleter。 只需接受該虛假控制塊的開銷即可。
使用別名構造函數。 std::weak_ptr
不能使用。
請參閱“ 將C ++共享指針的別名構造函數與空的共享指針一起使用 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.