我有程序需要發送緩衝區到套接字。我的問題是我可以在調用Winsock-> send()方法後立即刪除緩衝區嗎?使用winsoc發送緩衝區後可以刪除內存嗎?
爲什麼我提出了這個問題:我使用了Windbg工具來識別內存泄漏,並且它在BuildPacket()
中顯示了這個地方,新的內存沒有正確釋放。 所以我想在發送到套接字後清除內存。 這個方法將被調用大約4,00,000次,當我的程序在多個循環中運行時,這會消耗大部分內存。
請注意。假定m_ClientSocket
是一個已經建立的套接字連接。
bool TCPSendBuffer(char* pMessage, int iMessageSize)
{
try {
int iResult = 0;
iResult = send(m_ClientSocket, pMessage, iMessageSize, 0);
if (iResult == SOCKET_ERROR){
// Error condition
m_iLastError = WSAGetLastError();
return false;
}
else{
// Packet sent successfully
return true;
}
}
catch (int ex){
throw "Error Occured during TCPSendBuffer";
}
}
int BuildPacket(void* &pPacketReference)
{
TempStructure* newPkt = new TempStructure();
// Fill values in newPkt here
pPacketReference = newPkt;
return sizeof(TempStructure);
}
bool SendPackets()
{
void* ref = NULL;
bool sent = false;
int size = BuildPacket(ref);
sent = TCPSendBuffer((char*)ref, size);
// Can I delete the ref here...?
delete ref;
return sent;
}
struct TempStructure
{
UINT32 _Val1;
UINT32 _Val2;
UINT32 _Val3;
UINT32 _Val4;
UINT32 _Val5;
UINT32 _Val6;
UINT8 _Val7;
UINT16 _Val8;
UINT16 _Val9;
UINT16 _Val10;
UINT32 _Val11[16];
UINT32 _Val12[16];
bool _Val13[1024];
};
請諮詢任何可能的解決方案。謝謝。
發送操作完成後,您可以並且必須刪除緩衝區。在同步調用的情況下 - 在函數返回之後。在異步調用的情況下 - 通常在回調中,當操作完成時執行 – RbMm