[英]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.