[英]Retuning locally allocated object in C++ 2003
我對此代碼有不好的感覺
widget* GetNewWidget()
{
widget* theWidget = (widget *) malloc(sizeof(widget));
return theWidget;
}
首先,永遠不要轉換malloc()的結果(我懷疑也不能在C ++(?)中使用它。
其次,將不theWidget
在棧上分配的?
如果是這樣,在此函數返回后,調用者是否會嘗試訪問未定義的行為?
有人可以指向解釋此問題的權威URL嗎?
[更新]我在考慮這個問題是否可以在其范圍之外訪問局部變量的內存?
在堆棧上,您剛剛分配了一個指針,它與對象本身無關。 :)
我從不使用malloc(這是C的東西,您不應該在C ++中使用它),因此我不確定,但是我幾乎不相信它是未定義的行為。
如果您要編寫以下代碼: widget* theWidget = new widget();
它應該可以正常工作。
如果您擁有C ++ 11,則使用智能指針甚至更好
std::unique_ptr<widget> GetNewWidget()
{
std::unique_ptr<widget> theWidget(std::make_unique<widget>());
return theWidget;
}
或者在這種情況下,您可以編寫更小的代碼,如下所示:
std::unique_ptr<widget> GetNewWidget()
{
return std::make_unique<widget>();
}
當唯一指針超出范圍時,以上版本將清除內存。 (除非將其移至另一個unique_ptr)值得花一些時間來閱讀有關C ++ 11中的內存管理的信息。
返回指針就像返回一個int
:返回的行為就是創建按位復制。
malloc(sizeof(widget));
在堆[1]上分配一個內存塊,從某個地址開始(我們稱它為a ),並以sizeof(widget)
個字節長。
widget* theWidget = (widget *) malloc(sizeof(widget));
將地址a存儲在變量theWidget
的stack [2]上。 如果malloc
在地址0x00001248
處分配了一個塊,則小theWidget
現在將包含值0x00001248
,就好像它是整數一樣。
return theWidget;
現在,會導致返回的 值 ,即,值0x00001248
被寫入到哪里返回值的預期。
任何時候都theWidget
使用小部件的地址。 因此,不存在訪問指向theWidget
的懸空指針的theWidget
。 請注意,如果您的代碼將return &theWidget;
,可能會有問題。
[1]否則可能會失敗,並返回NULL
[2]或可能將其保存在寄存器中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.