[英]Interesting issue when attempting to reset pointer
由於我的 C++ 不是那么好,這可能是一個非常簡單/明顯的答案,但它確實讓我難過。 請記住,這里有點晚了,我有點累了。 我在這里得到了這段代碼:
void TestFunc(int *pVar)
{
cout << endl << *pVar << endl;
delete pVar;
pVar = nullptr;
}
int main(int argc, char *argv[])
{
int *z(new int);
*z = 5;
TestFunc(z);
if (z == nullptr)
cout << "z Successfully Deleted!" << endl;
else cout << "z NOT deleted!" << endl;
return 0;
}
該程序編譯得很好,沒有錯誤或警告。 當我運行它時,它會顯示5
,正如我所期望的那樣。 但是,它說z NOT deleted!
. 我很好奇為什么pVar
沒有設置為nullptr
,即使我在我的 TestFunc() function 中明確設置了它。 任何幫助,將不勝感激。 如果重要的話,這是 Visual Studio 2010,只是一個常規的非托管 C++ 應用程序。
因為它是按值傳遞的(即作為副本)。
如果您希望傳遞變量本身(而不僅僅是復制它的值),請使用
void TestFunc(int *&pVar)
反而。
請注意, delete
只關心指針對象,而不關心指針。 因此,“刪除”指針的副本會刪除與原始指針相同的內容,因為在任何一種情況下,您都在刪除它們的目標,它們是相同的。
TestFunc
按值接受指針,因此將其設置為 function 內的 null 實際上只影響 function 中的副本,並且對調用者不可見。 所以pVar
設置為 null,但main()
中的z
並不是因為它們是不同的變量。
要使調用者可以看到更改,請通過引用或雙指針傳遞指針。
來晚了(對不起。!!)。
z
按值傳遞。 z
不是pVar
。 您將nullptr
的值分配給pVar
而不是z
。
您提出的“成語”通常被提倡為Safe Delete 。
在 C 中已經知道(盡管當時它是free
的):將您剛剛釋放/刪除的指針清零以避免這樣做兩次。
問題是,您將當前指針歸零,但它的任何副本仍指向相同的 memory 區域,該區域現在包含垃圾。
Memory 處理是一個困難的話題,基本概念是所有權。 在任何時候,特定 memory 區域的所有者都應該被很好地識別,並且他們應該有責任在適當的時候將其歸還給系統。
朝着這個方向邁出的第一步是使用智能指針,例如std::unique_ptr
或boost::scoped_ptr
。 對於共享所有權(僅限專家), std::shared_ptr
可能會派上用場,但您還沒有。
如果您在代碼中編寫delete
,則意味着您將自己暴露在泄漏中。 它本身並不壞,但它需要仔細審查,並使代碼變脆(即,可能會因更改而中斷)。 在你的情況下:
int main() {
boost::scoped_ptr<int> i(new 5);
foo(*i);
} // memory returned to system by ~scoped_ptr()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.