簡體   English   中英

在C ++ 2003中重新調整本地分配的對象

[英]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 :返回的行為就是創建按位復制。

逐步,代碼工作如下:

  1. malloc(sizeof(widget));

    在堆[1]上分配一個內存塊,從某個地址開始(我們稱它為a ),並以sizeof(widget)個字節長。

  2. widget* theWidget = (widget *) malloc(sizeof(widget));

    將地址a存儲在變量theWidget的stack [2]上。 如果malloc在地址0x00001248處分配了一個塊,則小theWidget現在將包含值0x00001248 ,就好像它是整數一樣。

  3. return theWidget;

    現在,會導致返回 ,即,值0x00001248被寫入到哪里返回值的預期。

任何時候都theWidget使用小部件的地址。 因此,不存在訪問指向theWidget的懸空指針的theWidget 請注意,如果您的代碼將return &theWidget; ,可能會有問題。

[1]否則可能會失敗,並返回NULL

[2]或可能將其保存在寄存器中

暫無
暫無

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

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