2011-01-25 12 views
1

私はmallocで約128バイトのメモリを割り当てます。Reallocはnullを返しますか?

その後、私は約200バイトでreallocを呼び出しますが、nullを返しています!

フリーであれば有効なポインタを返し、次に別のmallocを返しますが、reallocを使いたいと思います。

この動作(私は明らかにメモリが不足していません)について説明できますか?これは有効な行動ですか?

コードビット:

//class constructor 
size = 0; 

sizeAllocated = DEFAULT_BUFFER_SIZE; //64 

data = (char*)malloc(sizeAllocated * sizeof(char)); //data is valid ptr now, I've checked it 

data[0] = '\0'; 

//later on: 
//append function 
bool append(char** data, const char* str, size_t strLen) { 
    if((size + strLen) >= sizeAllocated) { 
    sizeAllocated += strLen + 1 + BUFFER_ALLOCATION_STEP; 
    char* temp = realloc(*data, sizeAllocated * sizeof(char)); 
    if(temp) 
     *data = temp; 

    return(temp != NULL); 

}

EDIT:固定。私は< <演算子を自分のクラスにオーバーロードしていましたが、voidの代わりに*これを返しました。どういうわけかこれはすべてをねじっていた!なぜ誰がこのことが起こるのか説明できるなら、それはいいだろう!

+4

たくさん割り当て/割り当て解除していますか?ヒープの断片化を引き起こし、連続したメモリを制限する可能性があります。あなたは無料で200bを見つけることができないだろうとは思わないが。 –

+0

私はかなり小さいものを割り当てます - これはmain(){}の中に最初に置かれたとしても失敗します – Pubby

+0

valgrindの仕事のようです。 – bmargulies

答えて

1

次のコメントが質問

data = (char*)realloc(data, (size_t)(sizeAllocated * sizeof(char))); 

に追加されたので、私は同じ値である 定数でsizeAllocatedを交換した場合、それ reallocs正しく

今、私たちが理解することができます何が起こったのかsizeAllocatedを、同じ値を持たない定数で置き換えました。デバッグの目的で、sizeAllocatedの値を出力するステートメントを追加すれば、驚くでしょう。

+6

そして、FFSは、 'sizeof(char)'で何かを乗算するのをやめます。それは良い電子の無駄です:-) - これは、元のOPのコードだったので、これはWinProgではなくOPに向けられています。 – paxdiablo

+0

動作しませんでした。 reallocの直前に値をコンソールに出力することで定数を得ました。定数が実際にそれをとにかく固定しているかどうかはわかりません。時にはうまく動作しないと思われます。 – Pubby

+0

@paxdiablo - 私はあなたを十分に苦しめることはできません。私はCからの "キャスティングvoidポインタ"の反射を抑制しなければならなかった。 –

関連する問題