私はCで循環バッファプログラムに取り組んでいます。バッファは、バッファが新しい相場で更新されるたびにチェックされる特定の条件に応じて拡大および縮小できる必要があります(バッファには株価が含まれています)。ただし、バッファーを拡張して古い (小さい) バッファーを解放しようとすると、gilbc から「無効な次のサイズ」エラーが発生します。
私の拡張機能は次のとおりです。
cbuf* expandBuffer(cbuf *cb_ptr){
int newSize;
newSize = (cb_ptr->maxSize * 2) -1;
cbuf *tempBuffer = malloc(sizeof(cbuf) + newSize * sizeof(quote));
tempBuffer ->maxSize = cb_ptr->maxSize * 2;
tempBuffer ->start = cb_ptr->start;
tempBuffer ->end = cb_ptr->end;
tempBuffer ->freeSlots = tempBuffer->maxSize - cb_ptr->maxSize;
int x;
int counter;
counter = 0;
for(x = cb_ptr->end; x < cb_ptr->maxSize; x ++){
tempBuffer->quoteBuffer[counter].time = cb_ptr->quoteBuffer[x].time;
tempBuffer->quoteBuffer[counter].rate = cb_ptr->quoteBuffer[x].rate;
counter ++;
}
int y;
for(y = 0; y < cb_ptr->start; y ++){
tempBuffer->quoteBuffer[counter].time = cb_ptr->quoteBuffer[y].time;
tempBuffer->quoteBuffer[counter].rate = cb_ptr->quoteBuffer[y].rate;
counter++;
}
tempBuffer->start = cb_ptr->maxSize;
tempBuffer->end = 0;
free(cb_ptr);
return tempBuffer;
}
私の更新機能は次のとおりです。
void cbuf_update(cbuf *cb_ptr, unsigned int time, double rate){
*Code*
if(cb_ptr->freeSlots == 0){
printf("\n\nEXPANDING CIRCULAR BUFFER!\n\n");
*cb_ptr = *(expandBuffer(cb_ptr));
}
*More code here edited out since it doesnt pertain to question.
}
そして最後に私のメイン:
int main(){
cbuf *cb1 ;
cb1 = cbuf_init() ;
cbuf_update(cb1, 60, 1.291) ;
cbuf_update(cb1, 63, 1.287) ;
cbuf_update(cb1, 63, 1.231) ;
cbuf_update(cb1, 69, 1.229) ;
cbuf_update(cb1, 72, 1.247) ;
cbuf_update(cb1,361,1.291);
cbuf_update(cb1, 411, 1.291) ;
cbuf_update(cb1, 412, 1.281) ;
cbuf_update(cb1, 413, 1.292) ;
cbuf_update(cb1, 414, 1.284) ;
cbuf_update(cb1, 414, 1.290) ;
cbuf_update(cb1, 511, 1.241) ;
cbuf_update(cb1, 512, 1.251) ;
cbuf_update(cb1, 513, 1.232) ;
cbuf_update(cb1, 514, 1.202) ;
cbuf_update(cb1, 517, 1.119) ;
cbuf_update(cb1, 551, 1.080) ;
cbuf_update(cb1, 552, 1.081) ;
cbuf_update(cb1, 553, 1.079) ;
cbuf_update(cb1, 554, 1.088) ;
cbuf_update(cb1, 561, 1.072) ;
cbuf_update(cb1, 562, 1.113) ;
cbuf_update(cb1, 563, 1.091) ;
cbuf_update(cb1, 564, 1.092) ;
cbuf_update(cb1, 571, 1.089) ;
cbuf_update(cb1, 572, 1.073) ;
cbuf_update(cb1, 573, 1.061) ;
cbuf_update(cb1, 574, 1.111) ;
cbuf_update(cb1, 581, 1.119) ;
cbuf_update(cb1, 582, 1.123) ;
cbuf_update(cb1, 583, 1.151) ;
return 0;
}
このセグメンテーション違反は、次の行で発生します。
cbuf *tempBuffer = malloc(sizeof(cbuf) + newSize * sizeof(quote));
expandBuffer では、すでに一度正常に展開されています。バッファーを複数回拡張する必要がある場合は、その行でセグメンテーション違反が発生します。
ただし、コメントアウトすると:
free(cb_ptr);
セグメンテーション違反が発生しなくなりました。ただし、cb_ptr (「古い」バッファが新しいより大きなバッファに置き換えられる) は使用されなくなったため、解放する必要があります。これを解放し、cbuf_update で新しい大きなバッファを cb_ptr に返すとセグメンテーション違反が発生する理由について、私は混乱しています。