簡體   English   中英

C ++需要澄清有關析構函數和范圍的信息

[英]C++ need clarification about destructors and scope

我有一個問題,我很確定自己知道原因。 我想澄清一下。 我有一個包含其他類的類,但是為了簡單起見,我將示例限制為兩個類。

類A包含類B。在類A的構造函數中,它通過調用B的構造函數來初始化類B。 在類A的構造函數的末尾,將調用類B的析構函數,這不是我期望的行為。 這是一個例子

#include "b.h"

class a {
    public:
        b classB;

        a(int someParam);
};

cpp文件

#include "a.h"

//Class A's constructor
a::a(int someParam) {
    //Set class B by calling it's constructor
    classB = b(someParam);
    //Now class B's destructor gets called when exiting A's constructor...
}

我知道,如果在不使用“ new”的情況下聲明變量,則該變量在離開當前作用域時將被銷毀。 但是我一直認為這適用於變量的范圍,而不適用於為其分配值的范圍。 問題,對不對? 如果是這樣,那么執行classB = *new b(someParam);並沒有錯classB = *new b(someParam); 在那兒? 還是我應該只使用指針?

在這一行:

classB = b(someParam);

表達式b(someParam)創建一個臨時的無名b對象,然后將該對象分配給成員對象classB 只是此無名臨時對象的析構函數,而不是成員對象的析構函數。 如果要避免創建此臨時對象,而是使用適當的構造函數直接初始化成員對象,請使用初始化列表:

a::a(int someParam)
    :classB(someParam)
{}

和這個:

classB = *new b(someParam);

是即時內存泄漏。 您要在免費存儲區上分配一個對象,將分配給它的對象復制到classB ,並丟失指針。

暫無
暫無

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

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