1

ソケットからデータをrecv()してバッファーに格納する必要がありますが、ループ内にあるように、すべてのデータを確実に取得する必要があります。したがって、バッファのスペースが不足しないようにするために、reallocを使用してバッファに割り当てられたメモリのサイズを変更しようとしています。これまでのところ:

 // receive response
 int i = 0;
 int amntRecvd = 0;
 char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
 while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
  i += amntRecvd;
  realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
 }

ただし、Valgrindが「valgrind:「不可能」が発生しました:」と不平を言っているため、これは正しく機能していないようです。これを適切に行う方法について何かアドバイスはありますか?

ありがとう、Hristo

更新...reallocを誤って使用していることに気付きました。改訂版は次のとおりです。

 int i = 0;
 int amntRecvd = 0;
 char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
 while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
  i += amntRecvd;
  char *temp = realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
  if (temp != NULL) {
   pageContentBuffer = temp;
  }
 }

ただし、valgrindはまだ不平を言っています:

==25812== Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
==25812==    at 0x33B880DAA1: recv (in /lib64/libpthread-2.5.so)
==25812==    by 0x401D78: tunnelURL (proxy.c:371)
==25812==    by 0x40142A: client_thread (proxy.c:194)
==25812==    by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812==    by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
==25812==  Address 0x5642768 is 0 bytes after a block of size 4,104 alloc'd
==25812==    at 0x4A0590B: realloc (vg_replace_malloc.c:306)
==25812==    by 0x401D47: tunnelURL (proxy.c:373)
==25812==    by 0x40142A: client_thread (proxy.c:194)
==25812==    by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812==    by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
4

4 に答える 4

3

@whirlwindが言ったこととは別に、2番目の問題もあります。

sizeof以前に割り当てられたメモリの量を返しません。これは、実際には、と同等のコンパイル時の構成sizeof(char *)、つまり文字ポインタのサイズです。

変数でバッファの長さを手動で追跡する必要があります。malloc/reallocによって割り当てられたメモリの量を「尋ねる」標準的な方法はありません。

于 2010-04-21T01:26:44.440 に答える
2

realloc()を誤用しているため、おそらく問題があります。新しいポインタが返されるかどうかを確認する必要があります。返される場合は、そのポインタを保存します。

// receive response
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
    i += amntRecvd;
    pageContentBuffer = realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
}
于 2010-04-21T01:19:53.440 に答える
1

reallocを検索します。

sizeofはコンパイル時の値であり、実行時ではありません。

realloc0を返すことが可能です。

これを試して...

// receive response
int i = 0;
int amntRecvd = 0;
int currentSize = 4096;
int oldSize = currentSize;
char *pageContentBuffer = (char*) malloc(currentSize);
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
    i += amntRecvd;
    oldSize = currentSize; 
    currentSize += 4096; 
    char *newBuffer = malloc(currentSize); 
    memcpy(newBuffer,pageContentBuffer,oldSize); 
    free(pageContentBuffer); 
    pageContentBuffer = newBuffer;
}

あなたの最善の策は、メモリを明示的に再割り当てし、コピーしてから解放することです-realloc風変わりです。

于 2010-04-21T01:27:26.413 に答える
1

主な問題は、間違った量のメモリを再割り当てしていることです。あなたが欲しい

realloc(pageContentBuffer, 4096 + i);

sizeof(pageContentBuffer)はただsizeof(char *)です。これは、2回目の読み取りに必要な量よりもはるかに少ない再割り当てを意味します。

于 2010-04-21T02:46:24.830 に答える