這是我的代碼片段:
#include <iostream>
#include <list>
#include <memory>
class A
{
public:
int a = 100;
A()
{
std::cout << "Create A" << std::endl;
}
~A()
{
std::cout << "Release A" << std::endl;
}
virtual void printer() = 0;
};
std::list<std::shared_ptr<A>> arr;
class B : public A
{
public:
int b = 1000;
~B()
{
std::cout << "Release B" << std::endl;
}
void printer() override
{
std::cout << "B's printer" << std::endl;
}
B()
{
std::shared_ptr<A> tmp(this);
arr.push_back(tmp);
(*arr.begin())->printer();
std::cout << "inside B's c'tor test B counts: " << tmp.use_count()
<< std::endl;
}
};
int main(int argc, char const *argv[])
{
std::shared_ptr<B> B_ptr = std::make_shared<B>();
std::shared_ptr<A> A_ptr(B_ptr);
std::cout << "list address: " << (*arr.begin()).get() << std::endl;
std::cout << "test B address: " << B_ptr.get() << std::endl;
std::cout << "test A address: " << A_ptr.get() << std::endl;
std::cout << "list counts: " << (*arr.begin()).use_count() << std::endl;
std::cout << "test B counts: " << B_ptr.use_count() << std::endl;
std::cout << "test A counts: " << A_ptr.use_count() << std::endl;
return 0;
}
我的期望是:A的參考計數應該是3,但只有2。我認為當我push_back到串列時,應該有一個臨時創建的share_ptr物件,即使它被銷毀,串列中的那個也應該指向同一個地址為 A_ptr 和 B_ptr。事實證明,他們(那三個)確實指向了同一個地址,但是 use_count 得到了不同的結果。(*arr.begin()).use_count()是1,其他都是2。
為什么?請幫忙。
Ps:我知道把這個指標指向share_ptr 是愚蠢的操作,但是結果沒有意義,甚至違反了語法。
uj5u.com熱心網友回復:
我的期望是:A 的參考計數應該是 3,但只有 2。
你的期望是錯誤的。您只復制了一份共享指標,因此使用次數為 2。
std::shared_ptr<A> tmp(this);
在這一行中,您將您不擁有的裸指標的所有權轉移到新的共享指標中。由于這已經由另一個共享指標擁有,因此當兩個單獨的所有者試圖銷毀它時,程式的行為將是不確定的。
可以使用 從中創建共享指標std::enable_shared_from_this,但這并不簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/436690.html
