2013-04-28 135 views
2

是否可以使用以下代碼模擬動態分配的行爲。例如,我們不知道存儲在文件中的整數的確切數量,我們將讀取該文件,然後將其存儲在名爲Hello的數組中。動態分配

int x; 
int n=0; 
ifstream input("a.dat"); 
while (!input.eof()) 
{ 
    input >> x; 
    n++; 
} 
input.close(); 

int Hello[n]; 
cout << "n= " << n << endl; 

int i=0; 
while (!input.eof()) 
{ 
    input >> Hello[i]; 
    i++; 
} 
+0

我建議使用用'istream_iterator's初始化的向量。 – chris 2013-04-28 04:18:18

+0

可能的重複[如何爲一個字符串動態分配內存空間並從用戶獲取該字符串?](http://stackoverflow.com/questions/8164000/how-to-dynamically-allocate-memory-space-for-a -string-and-get-that-string-from-u) – joce 2013-04-28 04:48:51

回答

1
int Hello[n]; 

dynamic分配。如果您想以這種方式聲明Hello,則需要n是編譯時間常量。

嘗試:

int* Hello = new int[n]; 

,不要忘記釋放內存當你用它做:

delete[] Hello; 
1

這是允許的一些編譯器的擴展,但不是嚴格C++的一部分。

int Hello[n]; 

作爲替代方案,你可以自己分配內存:

int* Hello = new int[n]; 

並釋放IT自己也:

delete[] Hello; 

但是你可以從<vector> USNG std::vector避免手動內存管理。它的一個構造函數接受一個初始大小:

vector<int> Hello(n); // Vector with n elements, all initially 0. 

您還可以設置一個初始容量不調整,要做到分配一次:

vector<int> Hello; // Empty vector. 
Hello.reserve(n); // Allocate space for n elements; size() is still 0. 

然後讀入int並使用push_back插入值:

int value; 
while (input >> value) 
    Hello.push_back(value); 

注意使用input >> value作爲循環條件,這個讀取,只要讀取成功。 eof()僅當最後一次讀取操作因文件意外結束而失敗時才返回true,這不太可能正是您想要的。

2

是否有可能使用以下代碼模擬動態分配的行爲: 。

不,主要區別在於程序中的數組存儲在堆棧中,而所有動態內存分配都發生在堆上。

你到底在做什麼,在你的代碼中使用C++的C99標準C的VLA特性。用g ++編譯器中的-pedantic選項進行編譯將會揭示這一點。由於它不直接被C++支持,並且它是一個特定於實現的語言擴展,所以如果你的目標是編寫可移植的代碼,那麼使用它就不是一個好主意。

VLA的使用alloca(),以在運行時分配堆棧上的內存,並討論here這種技術的缺點。另外,VLA在運行時在堆棧上分配內存,如果該值超出範圍,程序就會崩潰,而使用VLA快速創建幾個字節的數組也是可以的,但可能會產生大量不確定的大內存不安全,最好使用動態內存分配來處理它。

+1

不需要迂迴,-std = C++ 11要好得多。 – rubenvb 2013-04-28 06:55:32

0

一開始第二

while (!input.eof()) 

總是會失敗。這終止了第一個,然後你設置關閉輸入流!