2017-10-28 8 views
0

私はC++メモリ管理に関する本を読んできましたが、細部まで細かく説明しています。しかし私は私が取り組んでいるプログラムを持っている、それはいくつかの本当に大きなベクトルや配列を処理する必要があります。 私は混乱しています。私は、大文字と小文字の区別なくメモリを割り当てることに決めました。MallocがXバイトを割り当てることができない場合ReallocまたはMallocを再度使用するか? C++

私の質問は、malloc()に一定のデータ量を試してみると何か問題が起きます。 malloc()を再度実行してデータを割り当てようとすると、realloc()を使用するか、malloc()をもう一度使用しますか?私は最初のmalloc()が失敗するので、それは愚かな質問のように聞こえると思う、それは全くmalloced取得しないだろう... ???あなたはまだそれにmalloc()を使用することができるはずですか?

だから私はどちらを使うのですか?または、次のうちどれも使用しませんか?

BYTE *allocptr; 
allocptr = (BYTE*)malloc(2500000); 
if (!allocArray) 
{ 
    allocptr = (BYTE*)malloc(1000000); 
} 
// program code 
free(allocptr); 

または私はバイトの少ない量をしようとするrealloc()を使用する必要があります... の代わりに、再びmalloc()をしようと最初malloc()が失敗した場合は?最初malloc()はallocptr等しいNULLではないだろう250万バイトを割り当てに失敗した場合allocptrはNULLに等しかった場合は...私は上malloc()を使用することができなかったので、私はこの質問を求めている理由はある

BYTE *allocptr; 
allocptr = (BYTE*)malloc(2500000); 
if (!allocptr) 
{ 
    allocptr = (BYTE*)realloc(allocptr, 1000000); 
} 
// program code 
free(allocptr); 

それはrealloc()の代わりにrealloc()がNULLに等しいポインタを取ることができないと思ったからです。

+0

あなたは何[reallocの](HTTPについて混乱しているようです。 cplusplus.com/reference/cstdlib/realloc/)が行います。メモリブロックがない場合は、メモリブロックのサイズを変更することはできません。 – tkausl

+0

@tkauslはい、私は読んでいた本の中で、それがNULLかそれと同等のreallocポインタを使用できないという事実に対処しました。 – MAXBD

+0

'realloc'は2つのパラメータ(ポインタとサイズ)をとりますので、コードは機能しません。 –

答えて

1

Reallocは、割り当てられたブロックまたはメモリのサイズを変更します(または新しいものを割り当て、古いコンテンツをコピーします)。たとえば、5バイトのメモリが割り当てられ、後で5バイトが必要であることがわかったときにこれを使用します。

mallocが失敗したあなたのケースでは、あなたが開始するためにメモリの任意のブロックをやったことがなかったので、そこに再配分するものは何もありませんので、あなたはmallocを使用すると思います。

注:@DavidSchwarzが述べたように、でreallocを使用しますが、これは最初のパラメータがNULLの場合はmallocを呼び出すのと同じです。

+0

あなたは実際に質問に答えなかった。答えは、 'malloc'と' realloc'の両方を使うことができるということです。これは、両方とも新しいメモリブロックを割り当てるために使うことができるからです。 –

0

ここでは2つのことが起こっています。 1つは、失敗したmalloc()の動作に関係しています。 malloc()は動作し、メモリブロックへのポインタを返すか、メモリの割り当てに失敗し、NULLポインタを返します。 (2番目のケースでは、「最善を尽くす」とは反対に、要求された量より少ない値を割り当てるのではなく、メモリが割り当てられないことに注意してください)。

2番目の例は、reallocとmallocのエラーケース。 realloc()は、とりわけ、malloc()によって以前に割り当てられたメモリブロックへのポインタをとります。しかし、ポインタがnullである場合、realloc()malloc()とまったく同じように動作し、新しいブロックが割り当てられます。 (そしてrealloc()呼び出しが失敗した場合、復帰したばかりmalloc()のように、NULLポインタである。)

参考文献:// WWW:c++ mallocc++ realloc

関連する問題