[英]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.