簡體   English   中英

嘗試重置指針時的有趣問題

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

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