亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是懸空的指針?

什么是懸空的指針?

C++
LEATH 2019-06-24 17:06:03
什么是懸空的指針?我知道這是個很常見的問題,但對我來說還是新鮮的!我不明白懸掛指針的概念,在谷歌上搜索,并編寫測試方法來找到一個。我只是想知道這是一個懸空的指針嗎?無論我找到什么例子,都會返回一些東西,這里我正在嘗試類似的東西!謝謝!void foo(const std::string name){     // will it be Dangling pointer?!, with comments/Answer     // it could be if in new_foo, I store name into Global.     // Why?! And what is safe then?     new_foo(name.c_str());}void new_foo(const char* name){     // print name or do something with name...   }
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

懸掛指針是指向無效數據或不再有效的數據的指針,例如:

Class *object = new Class();Class *object2 = object;delete object;object = nullptr;// now object2 points to something which is not valid anymore

即使在堆棧分配對象中也可能發生這種情況:

Object *method() {
  Object object;
  return &object;}Object *object2 = method();// object2 points to an object which has been removed from stack after exiting the function

返回的指針c_str如果字符串隨后被修改或銷毀,則可能會變得無效。在您的示例中,您似乎沒有修改它,但由于不清楚您將如何處理const char *name不可能知道你的代碼本質上是安全的還是不安全的。

例如,如果您將指針存儲在某個位置,然后相應的字符串被銷毀,則指針將無效。如果你用const char *name就在.的范圍內new_foo(例如,為了打印目的)指針將保持有效。


查看完整回答
反對 回復 2019-06-24
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

懸空指針是指向未分配(已經釋放的)內存區域的(非空)指針。

考慮到字符串不是通過new_foo修改的,上述示例應該是正確的。


查看完整回答
反對 回復 2019-06-24
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

就風格而言,我將一個懸空的指針解釋為“一個仍然存在的指針,即使它指向的對象不再存在”。

在您的例子中,指針name它所指向的對象存在的時間較短。所以它永遠不會晃來晃去。

在普通的C+類中,指針在很短的時間內懸空,在析構函數中。那是因為delete語句在最后一個},而指針本身在最后一次停止存在。}..如果你不想擔心這個,可以使用。unique_ptr<T>..這個T*指針將在unique_ptr::~unique_ptr破壞者,這是完全安全的。


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 665 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號