0

これらの25,000,000,000ユニットを割り当てます:

struct test
{
 public:
 test();
 void insert(unsigned int var1, unsigned int var2, unsigned long var3);
      bool isEmpty() const;
      unsigned char * data;
};


test::test()
{
data = NULL;
}

bool test::isEmpty() const
{
  return (data == NULL);
}


unsigned long index = 25000000000;

このような :

test *something = new (nothrow) test[index];
    if (!something)
     {
     cout << "Error allocating memory for [something]" << endl;
     return ;
    }
    cout << "DONE !" << endl;

次に、NULLmade sureに初期化されます。data

unsigned long j=0;
        while (j<index) 
        {
          something[j].data = NULL;
          j++;
        }

そして、このように何か[]を反復する場合を除いて、それはすべて良いです:

test *chk;
unsigned long empty = 0;
unsigned long not_empty = 0;
unsigned long i=0;
for (i=0; i< index; i++ )
{ 
    chk = &something[i];
    if (!chk->isEmpty())
     {
    not_empty++;
    } else
    empty++;
}


cout << "Empty [" << empty << "]" << endl;
cout << "Not Empty [" << not_empty << "]" << endl;
cout << "Total [" << empty + not_empty << "]" << endl;

(最後の更新)

ハードウェアの問題であることが判明しました-メモリ。一部のスティックが他のスティックと一緒に正しく機能していませんでした。提案をしてくれたみんなに感謝します.o /

(アップデート)

NULL (not_empty) ではない初期化された要素の定数を取得します。理由はまだわかりません。もちろん、空 + not_empty = インデックスです。

data = NULL;コンストラクター関数でコメントアウトすると、配列を割り当てた直後にループすると、適切な空/空でない数値が取得されます。それでも、ポインターを NULL に強制した後、配列を再度ループした後、同じ定数の not_empty 値を取得します。

また、これを malloc() を使用して単純なポインターに作り直しましたが、違いはありませんでしたが、ポインターを設定するまで、ポインターが正しい (空である) ことに最初に気付いたのはそのときでした。

小さい [index] 値 (5,500,000,000) でいくつかのテストを行いましたが、動作を再現できませんでした。

Google の ltcmalloc を使用しており、割り当てられたメモリ サイズが示すように、正しい [インデックス] サイズを使用しています。

4

1 に答える 1

0

25000000000ではなく、25000000000ulと書きます。あなたの数値は 32 ビット整数になると思われます。したがって、j < 25000000000 は int(25000000000) = -769803776 として常に true です。

于 2013-09-02T14:07:22.127 に答える