搜尋

首頁  >  問答  >  主體

java - 是否类 类型指针、引用作为形参 ,函数结束不会自动析构类?

自动析构是在作用域结束时析构作用域里创建的类对象的吗?

PHP中文网PHP中文网2802 天前813

全部回覆(3)我來回復

  • ringa_lee

    ringa_lee2017-04-18 10:53:17

    如果是用指針new出来的对象, 必须进行手动delete. 析构函数不会帮你自动析构, 比如std::string* s = new std::string;. 如果这是在一个类里面构造的string, 这个类会将s回收, 但是不会将s指向的空間回收. 引用你只要記住其實就是一個別名就能做出自己的判斷了.

    回覆
    0
  • 阿神

    阿神2017-04-18 10:53:17

    我不該講那麼多有的沒的,而且我理解的不對。

    在函數結束時,只有聲明在函數體內的自動變數和函數的形式參數會被銷毀(destroyed),他們所引用的物件(若有),不會隨他們的銷毀而被銷毀。一個指標/引用所引用的物件有自己獨立的儲存期,這個物件何時被銷毀,取決於它自己的儲存期。

    你在問題中問的是何時隱式呼叫析構函數。析構函數的隱式呼叫同樣取決於這個物件的儲存期。簡單的說,若物件被構造,則析構函數會在他被銷毀時被呼叫。

    12.3.2.11 Destructors are invoked implicitly
    — for constructed objects with static storage duration (3.7.1) at program termination (3.6.3),
    — for constructed
    — for constructed objects with automatic storage duration (3.7.3) when the block in which an object is created exits (6.7),
    — for constructed temporary objects when the life. objects allocated by a new-expression (5.3.4), through use of a delete-expression (5.3.5),
    — in several situations due to the handling of exceptions (15.3).


    關於引用:

    引用不是對象,但他同樣有儲存期(儲存期對任何變數都適用)。儲存期的銷毀規則同樣適用於引用。

    但是在引用被銷毀時發生什麼,我沒有找到準確的描述。究竟引用如何被銷毀應該是取決於編譯器實作。大概情況應該是:如果引用在實作時佔有儲存空間,則該空間會被回收。如果不佔有,則什麼事都不會發生。 (引用型別的形式參數在函數不被內聯時常常會佔有儲存空間)

    3.7.3 The storage duration categories apply to references as well. The lifetime of a reference is its storage duration.

    8.3.2.4 It is unspecified whether or not a reference requires storage.

    3.9.8 An object type is a (possibly cv-qualified) type that is not a function type, not a reference type, and not a void type.

    1.8 [...] An object is a region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. — end it occupies storage in the way that objects do. — end note ] [...]

    note ]

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:53:17

    1.析構函數是c++針對類別引入的,是在類別變數生命週期結束之後,空間被回收之前被呼叫的函數。
    2.類別指標和類別參考(指向變數的常指標)只是基本資料型別(指標),並沒有析構函式之說,函式呼叫結束之後他們對應的堆疊空間會被回收而已。
    3.如果參數傳遞的是類別物件則如第一點說的那樣,在空間被回收之前調用析構函數。
    4.所有的堆疊上的類別變數都會在生命週期結束後自動析構,而堆上的類別變數(new等操作分配的)則不會,需要手動釋放去觸發析構函數的呼叫。

    回覆
    0
  • 取消回覆