這個關于共享指標的鏈接指出
您可以通過以下方式將 shared_ptr 傳遞給另一個函式: ... 傳遞底層指標或對底層物件的參考。這使被呼叫者可以使用該物件,但不能使其共享所有權或延長生命周期。如果被呼叫者從原始指標創建 shared_ptr,則新的 shared_ptr 獨立于原始指標,并且不控制底層資源。當呼叫者和被呼叫者之間的合同明確指定呼叫者保留 shared_ptr 生命周期的所有權時,使用此選項。
類似的案例使用原始指標來展示使用初始化共享指標的更好實踐,make_shared并new明確指出如果發生從原始指標的初始化,將導致資源洗掉兩次。
我也試圖在下面運行代碼:
void f(int* ptr)
{
shared_ptr<int> sptr(ptr);
cout << "sptr in f: " << sptr.get() << endl;
}
int main()
{
auto sp1 = make_shared<int>(1);
cout << "sp1 in main: " << sp1.get() << endl;
f(sp1.get());
return 0;
}
并得到以下錯誤。
sp1 in main: 0x6000016f5138
sptr in f: 0x6000016f5138
a.out(12083,0x119097600) malloc: *** error for object 0x6000016f5138: pointer being freed was not allocated
a.out(12083,0x119097600) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort ./a.out
我的問題是給定鏈接中的含義是
如果被呼叫者從原始指標創建 shared_ptr,則新的 shared_ptr 獨立于原始指標,并且不控制底層資源。
當我的示例代碼輸出和上面類似的堆疊溢位帖子鏈接不是這種情況時。
uj5u.com熱心網友回復:
這一段措辭很奇怪。如果去掉這句話:
如果被呼叫者從原始指標創建 a
shared_ptr,則新的 shared_ptr 獨立于原始指標,并且不控制底層資源。
沒關系。事實上,在這種情況下,談論如果被呼叫者創建一個新的會發生什么shared_ptr是不合邏輯的。
這句話旨在警告不要從作為引數傳遞的隨機指標創建一個shared_ptr。新shared_ptr的是“獨立于原始的”,但句子的其余部分最好表述為“它們都將試圖破壞底層資源”。與其說它不“控制”它,不如說它不“控制”它。就是它沒有正確地這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506509.html
