簡體   English   中英

將指針作為參數傳遞並清理

[英]Passing pointers as arguments and cleaning up

我的代碼如下所示:

Function()
{
    struct* str = NULL;
    SomeFunction(&str);
    //continue using str
}

SomeFunction(struct** input)
{
    struct* temp = NULL;
    FillInStruct(&temp);
    *input = temp;
    WTSFreeMemory(temp);
    return;
}

因此,我期望在清理temp之后,我的輸入指針也將變為無效,並且在第一個函數中,由於已對其進行清理,因此我不再應該使用str指針。 但這沒有發生,我真的不知道為什么。 我清理了臨時指針,但我的輸入和str指針仍指向正確的結構,因此我可以繼續使用這些指針。 有什么想法嗎? 將*輸入=溫度; 做某種復制嗎?

謝謝。

在C ++中釋放內存對指向它的指針沒有任何作用。 因此,您的“輸入”指針(在Function()中也稱為“ str”)將在SomeFunction()返回后指向已釋放的內存。 釋放后的內存內容以及保持可用狀態的時間完全取決於編譯器,並且有些隨機。 某些編譯器(如Visual C ++)將在“調試”版本中用模式填充釋放的內存,以使其更容易捕獲此類錯誤,但前提是您使用的是標准C / C ++操作(malloc / free / new /刪除)。

諸如Java和C#(以及許多其他語言)之類的垃圾收集語言通常沒有這種歧義和錯誤源。 您是否需要使用C ++的原因?

我建議一種通過將值復制到對象中而不是返回指針來返回值的方法。 我不知道您的“結構”是什么,但我們稱它為“ X”:

Function()
{
    X thing;
    SomeFunction(&thing);
    //continue using thing
}

SomeFunction(X* input)
{
    X* temp = NULL;
    FillInStruct(&temp);
    *input = *temp;  // copy whole object not just pointer
    WTSFreeMemory(temp);
    return;
}

暫無
暫無

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

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