[英]C++ comparing a pointer to NULL
我對C ++很新,所以請耐心等待。
我有以下程序來了解動態內存分配。
#include<iostream>
#include<new>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "How many numbers would you like to enter? ";
cin >> i;
p = new (nothrow) int [i];
if (NULL == p){
cout << "Not enough memory!";
}else{
for (n=0; n<i; n++){
cout << "Enter a number: ";
cin >> p[n];
}
cout << "You have entered: ";
for(n=0; n<i; n++){
cout << p[n] << ", ";
}
delete[] p;
}
return 0;
}
只要最初輸入合理的金額,程序就會按預期運行。 但是當輸入一個巨大的數字(1000000000000)時,我預計輸出“內存不足”,實際上它開始打印“輸入一個數字:”大概是100億次,顯然我還沒有等待輸出。 由於這是檢查的“其他”部分,為什么會發生這種情況? 我猜這個比較不起作用。 任何幫助表示贊賞。 謝謝。
如果您輸入的第一個數字更多是2 ^ 31,則可能的原因之一如下:
在您提供無效數據后,第一次cin變為無效狀態,並且每個下一個數據輸入操作(例如>>)都不執行任何操作(因此它不會等待您的輸入),除非您明確地將cin返回到正常狀態。
您可能的解決方案之一是:添加之后
cin >> p[n];
這段代碼:
if (cin.fail()) {
cout << "Bad data" << endl;
cin.clear();
}
根據操作系統的不同,即使沒有足夠的內存,也可以授予對大塊內存的請求,希望在需要的時候就足夠了(某些進程可能釋放了它所擁有的內存,或者更多的交換內存)可能會變得可用)。 在這些系統中,對分配器的調用將成功,但內存將僅在需要時(即,當您使用內存頁時)傳遞給進程,最終在無法分配下一頁時觸發錯誤。
這不是C ++的問題,而是操作系統的行為。
首先,正如有人已經注意到的那樣,可能實際分配了10億。 它適合整數(限制大約20億),它需要你有4GB的內存。
無論如何,在開始打印之前,我建議您打印輸入中收到的數字(然后暫停,一秒鍾或等待用戶輸入):該值可能與您預期的不同,因為它可能太大了,無法從cin中正確閱讀。
因此,您可能希望將i
定義為unsigned long long
。
unsigned long和unsigned long long有什么區別?
另外,檢查你是不是將cin置於錯誤狀態,給出了一個無法解析的字符串
從Mooing Duck建議編輯:
使用
if (std::cin >> variable) { }
要么
while(std::cin >> variable) { }
避免這個問題。 避免檢查.bad()
.fail()
或.eof()
,它們經常被誤用,導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.