簡體   English   中英

為recv()中使用的緩沖區重新分配內存

[英]realloc()ing memory for a buffer used in 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:“不可能”發生:”,因此這似乎無法正常工作。 關於應該如何正確執行的任何建議?

謝謝,克里斯托

更新...我意識到我不正確地使用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)

除了@whirlwind所說的以外,還有第二個問題:

sizeof不返回先前分配的內存量,它實際上是一個編譯時構造,等效於sizeof(char *) ,即字符指針的大小。

您將需要在一個變量中手動跟蹤緩沖區的長度。 沒有標准方法可以“詢問” malloc / realloc已分配多少內存。

可能有一個問題,因為您濫用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));
}

查找realloc

sizeof是編譯時間值,而不是運行時。

realloc可能返回0。

嘗試這個...

// 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是古怪的。

您的主要問題是重新分配了錯誤的內存量。 你要

realloc(pageContentBuffer, 4096 + i);

sizeof(pageContentBuffer)只是sizeof(char *) ,這意味着您重新分配的內容遠遠少於第二次讀取所需的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM