簡體   English   中英

C ++:運算符new和default構造函數

[英]C++ : operator new and default constructor

我在理解如何與構造函數一起使用動態分配時遇到了麻煩。

我在我的代碼中使用了一個名為graph的類(它只是表示節點之間邊緣的bool 2-d矩陣),並帶有以下構造函數/析構函數(還有其他方法,但我認為在這里不相關):

class graph{

private:
bool** edges;
int size;

public:
graph(int size = 0):size(size){
    edges = new bool*[size];
    for (int i = 0; i < size; i++){
        edges[i] = new bool[size];
    }
}

~graph(){
    for(int i = 0; i < size; ++i) {
        delete [] edges[i];
    }
    delete [] edges;
}

//others methods

};

我主要要使用動態分配:

int main()
{

    int size;
    cout << "Enter graph size :" << endl;
    cin >> size;

    graph g1 = new graph(size);

    //some processing code

    return 0;
}

Howewer,我在實例化時出錯(即new graph(size)):

從'graph *'到'int'的無效轉換[-fpermissive]

我並沒有真正弄明白問題出在哪里,而且我很確定這是我在其他地方已經看到的語法。

實際上,我並不真正了解內存分配如何與對象的創建一起工作。

在這里,我在構造函數中使用new來創建bool 2d-matrix,所以它會進入堆,不是嗎? 但是,如果我使用以下靜態指令實例化該對象:graph g1(const_size);

那不是應該去棧嗎?

預先感謝您的回答。

編輯

最后一個問題:

圖形* g1 =新圖形(大小);

將g1(指針)存儲在堆棧上,但是對象是在堆上創建的。

圖g1(size);

在堆棧上創建對象,而g1是對其的引用。

但是無論如何,矩陣的邊緣會在堆上? 或者在第二種情況下,它將以某種方式結束堆棧?

錯誤在這里:

graph g1 = new graph(size);

應該是:

graph *g1 = new graph(size);

原因如下:

new graph(size)

正在創建新的graph對象,並返回指向它的指針(具有graph*類型),並且:

graph g1 = ... 

正在嘗試將該對象轉換為int (以便調用graph(int)構造函數)-因此錯誤是invalid conversion from 'graph*' to 'int'

現在,我想這是某種練習,因為在此示例中您不應該在堆上使用分配。 但是,無論如何,請不要忘記:

delete g1;

實際上,我並不真正了解內存分配如何與對象的創建一起工作。

graph *g1 = new graph(size);

g1 (指針)存儲在堆棧上,但是對象是在堆上創建的。

graph g1(size);

在堆棧上創建對象,而g1是對其的引用。

PS避免這種情況:

 graph g1 = graph(const_size);

這將首先在語句的右側創建評估,並將臨時graph對象,並將使用copy-constructor初始化g1

但是,例如,如果我想要一個可以處理各種圖形大小的程序,而不必每次使用不同大小的圖形時都進行重新編譯,那么我將需要類似的東西,不是嗎?

不,您可以為此使用堆棧分配(我剛剛注意到,在您的示例中,您使用的是const_size-分配給堆棧的對象的構造函數的參數不需要恆定):

int size;
std::cout << "Enter size: ";
std::cin >> size;
graph g1(size);

是的,這里不需要動態分配,我只是編寫了代碼來練習自己。 但是如果我想在不重新編譯的情況下使用各種大小的圖形,這將是必要的,不是嗎?

不,請看此上方的示例-堆棧分配的對象,其大小可變-無需重新編譯。

我以為我們不應該自己調用析構函數,而超出范圍時無論如何都要調用它? (我什至讀到在某些情況下調用它實際上是不好的,因為它可能是第二次調用它)

對於堆棧分配的對象,這是正確的-析構函數將在作用域的末尾被調用。 但是,如果在堆上分配對象,則在調用delete之前不會調用析構函數。

但是無論如何,矩陣的邊緣會在堆上?

    edges = new bool*[size];
    for (int i = 0; i < size; i++){
        edges[i] = new bool[size];
    }

是的,整個矩陣都分配在堆上。

暫無
暫無

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

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