我有兩個shared_ptr
指向相同的int
,即在他們呼叫get()
返回相同的地址。但撥打use_count()
返回1
。當他們最後超出範圍,它會嘗試釋放已被另一種釋放的內存,導致雙自由運行時錯誤:std :: shared_ptr的use_count遞增的方式是什麼?
#include <memory>
#include <iostream>
using namespace std;
int main() {
shared_ptr<int> sp1(make_shared<int>(7));
shared_ptr<int> sp2(&(*sp1));
cout << sp1.use_count() << endl; // 1
cout << sp2.use_count() << endl; // 1
cout << sp1.get() << endl; // same address
cout << sp2.get() << endl; // same address
}
//^Double free runtime error at closing brace.
同樣的事情發生在這個變體具有顯式聲明的原始指針:
int main() {
int *raw_ptr = new int(8);
shared_ptr<int> sp3(raw_ptr);
shared_ptr<int> sp4(raw_ptr);
cout << sp3.use_count() << endl; // 1
cout << sp4.use_count() << endl; // 1
cout << sp3.get() << endl; // same address
cout << sp4.get() << endl; // same address
}
//^Double free runtime error at closing brace.
爲什麼如果兩個shared_ptr
小號點use_count()
回報1
(但不2
),以同樣的事情?如果use_count()
返回1
,那麼爲什麼有試圖釋放兩次int
?我認爲shared_ptr
會將use_count
增加1,當且僅當它指向與其弟弟shared_ptr
s相同的地址。
是S建設由原始指針「僅由第一shared_ptr
遞增小號use_count
‘一個std::shared_ptr
(或分配到原始指針中,如果默認構造的),然後通過附加的shared_ptr
s’的複製結構或分配由任何的之前shared_ptr
s?如果有的話,還有什麼其他的增值方式?
嘗試改爲'shared_ptr sp4 = sp3;'。您需要複製共享指針對象本身;用相同的原始指針創建一個新的共享指針只意味着你有兩個共享指針,每個指針都認爲它們擁有對象的獨佔所有權。如果你改用'shared_ptr sp3(new int(8));' - 不要讓程序中的原始指針可見,以免意外使用它,這會更容易。 –
cdhowie
2014-11-05 22:10:06
其實,更好的辦法是'auto sp3 = std :: make_shared(8);'因爲這允許C++實現在單個內存分配中爲'int'和'shared_ptr'控制塊分配空間。 (這個標準不需要這個優化,但是它確實允許,如果你使用'shared_ptr (new int(8))',那麼這個優化是不可能的。) –
cdhowie
2014-11-05 22:17:41
@cdhowie,好點。我的評論只是爲了讓別人更清楚,如果做'shared_ptr sp3(new int(8)); shared_ptr sp4(new int(8));''''sp3'和'sp4'指向具有相同值的不同'int'(在不同的地址)。 –
CodeBricks
2014-11-05 22:22:00