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