2009-12-30 81 views
1

我正在編寫TCP連接的客戶端,並且從IP到socket_addr的轉換會導致內存泄漏。Unix套接字:hostent使內存泄漏

還有就是以下過程:

#include <netdb.h> 
#include <sys/socket.h> 
#include <sys/types.h> 

/** there is some code like method header etc. */ 

hostent * host = gethostbyaddr(ip, 4, AF_INET); // ip is char[4], I use IPv4 

if (!host) return -2; // bad IP 

netSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if (netSocket == -1) return -3; // error during socket opening 

sockaddr_in serverSock; 
serverSock.sin_family = AF_INET; 
serverSock.sin_port = htons(port); 
memcpy(&(serverSock.sin_addr), host->h_addr, host->h_length); 

// and now there is function connect(...); 

/** end of method */ 

此代碼工作正常,但是當我使用跟蹤內存我花了5個內存泄漏。他們是由該行創建:

hostent * host = gethostbyaddr(ip, 4, AF_INET); // ip is char[4], I use IPv4 

我試圖刪除它delete host;但這會導致分段錯誤。

你有什麼想法我可以如何清理內存嗎?這是我的學校項目,我們必須正確處理記憶。

編輯: 我使用Linux操作系統Ubuntu 9.04,G ++ 4.3.3和存儲器測試擋泥板庫

回答

7

你不說你是什麼平臺上,但通常是由gethostbyaddr返回的內存將被分配和由你正在使用的套接字庫管理 - 你不要自己釋放它。無論你用什麼來診斷泄漏,都可能帶來誤報。

例如,此手冊頁http://www.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html表示返回的指針可能是靜態數據,而MS使用線程本地存儲。在任何情況下都不能或者應該釋放數據,並且在任何情況下都沒有泄漏。從Windows gethostbyaddr函數

+0

我使用Linux Ubuntu 9.04與g ++編譯器4.3.3。我用mudflap測試內存,它工作的很好,所以我不認爲這是誤報 – Gaim 2009-12-30 18:52:57

+2

我曾經使用的所有內存分配跟蹤器都會給出誤報。無論如何,如果您希望您的應用程序完全可以隨身攜帶,則無法釋放內存。 – 2009-12-30 18:55:58

+0

感謝您的解決方案,雖然它並不令我高興。 – Gaim 2009-12-30 19:06:30

1

記者問在MSDN

的應用程序不應該試圖 釋放由 使用的內存返回hostent結構。 應用程序絕不會嘗試修改此結構或釋放其組件的任何 。此外,只有 一個這個結構的拷貝 每個線程分配的,所以 應用程序應該在發出 任何其他函數調用 gethostbyaddr或之前的gethostbyname需要任何 信息拷貝。

+0

感謝您的信息,但它不能解決我的漏洞問題 – Gaim 2009-12-30 18:54:53

1

hostent結構由套接字庫內部分配,並保留以供後續調用重用。即使如你所觀察到的那樣,記憶也不會被泄漏。

+0

我使用Unix套接字,所以它不是WinSock - 它是在主題名稱 – Gaim 2009-12-30 18:55:40

1

嘗試使用getaddrinfo()freeaddrinfo(),如gethostbyname的聯機幫助頁中所示。

+0

好吧,我會試試看,謝謝。你能給我一個手冊頁鏈接嗎?我試圖找到它,但沒有成功。 – Gaim 2009-12-30 18:56:39