簡體   English   中英

從中創建一個shared_ptr后刪除原始指針

[英]Delete raw pointer after creating a shared_ptr from it

如果我執行以下操作,

int* p = new int(10);
std::shared_ptr<int>(p);
delete p;

這里會發生什么? 刪除原始指針后, shared_ptr無效嗎? 在這種情況下,有什么方法可以確保內存訪問安全?

您問題中的代碼包含p 2個沖突定義。 我假設您打算發布類似

int* p = new int(10);
std::shared_ptr<int> p1(p);
delete p;

shared_ptr超出范圍並且其引用計數降至零時,它將嘗試delete p; ,導致雙重刪除和不確定的行為。

您已經將動態分配的int所有權傳遞給了shared_ptr ,因此讓它完成其工作,不要自己刪除int


如果希望API的客戶端執行與上面的代碼類似的操作,則一種可能性是將API函數的參數類型從shared_ptr更改為構造函數參數的參數包。 例如

template<typename T, typename... Args>
void api_func(Args&&... args)
{
    auto p = std::make_shared<T>(std::forward<Args>(args)...);
    // Use the shared_ptr p as before
}

然后,客戶端代碼無需傳遞shared_ptr<int> ,而是將上述函數作為api_func<int>(10);調用api_func<int>(10);

暫無
暫無

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

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