簡體   English   中英

通過指針為類內部的struct內部的C ++動態內存分配分配了nullptr“有時”

[英]C++ dynamic memory allocation of struct inside class via pointers is assigned nullptr “sometimes”

我有一個簡單的例子。 我有一個類,在其中有一個結構,其中包含一個double類型的指針。 在該類內部,使用其中的函數,我打算使用指針分配動態內存。 出於好奇,為什么有時在我編譯(占編譯時間的50%)時將這些指針初始化為null,有時卻不為null?

從頭文件開始的最小工作示例可能是:

class house{

    struct room{
        double *roomPtr;
    } roomObj;

    room *myRoom = &roomObj;

public:
    void startPainting();

private:
    void paintRoom();
};

至於我的cpp文件,則可以將其總結為(通過上面的一個最小示例)為:

void house::paintRoom(){
    if (myRoom->roomPtr != nullptr){
        myRoom->roomPtr = new double[someNbr];
    }
    else{
        cout << "Allocation failed !" << endl;
    }
}

為了方便起見,請考慮在此類中,公共功能的工作是簡單地分配內存(暫時不要釋放內存),即

void house::startPainting(){
    paintRoom();
}

無論如何,在編譯main時(通過簡單地創建類的對象並運行public函數...),有時(幾乎每隔一次)我會收到“分配失敗!” -即指針為空。 這是典型的,還是我做錯了什么?

另外,我知道我可以不使用上面的方法來分配內存,而可以自己執行以下操作而無需其他指針:

roomObj.roomPtr = new double[someNbr]; 

這總是有效的,但是我再次好奇為什么上面的方法並不總是有效。 您能否對我的缺點有所了解?

謝謝 !

您需要將指針roomPtr分配給默認值,例如在類的構造函數中。 這些對象中的內存以實現定義的方式初始化,因此您可以隨機將其分配為空值,但不能保證。

例如,此修改會更好,並提供一致的行為:

house::house() : roomObj(), myRoom(&roomObj) {
   myRoom->roomPtr = nullptr;
}

順便提一句,對於我來說,為什么當您有一個單獨的成員變量來描述它時,為什么第二個成員變量僅指向同一類中的某些內存,這對我來說並沒有什么意義。

暫無
暫無

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

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