2017-05-16 104 views
1

我有程序需要發送緩衝區到套接字。我的問題是我可以在調用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]; 
}; 

請諮詢任何可能的解決方案。謝謝。

+0

發送操作完成後,您可以並且必須刪除緩衝區。在同步調用的情況下 - 在函數返回之後。在異步調用的情況下 - 通常在回調中,當操作完成時執行 – RbMm

回答

3

這可能是指您的newBuildPacket因爲您沒有delete它但你確實將它分配給另一個指針,並且被取消分配,所以它很可能是誤報。

然而,更重要的問題是,你已經在你的代碼未定義的行爲,即:

void* ref = NULL; 
delete ref; 

這是不確定的行爲叫deletevoid*,你應該刪除它之前投放。

+0

而不是'void *'我可以擁有結構本身'TempStructure * ref = NULL;'。所以刪除這個應該清除正確創建的內存? – killer

+0

@ killer是的,沒錯。 –

+0

感謝boss @Gill Bates。所以刪除不會影響已經發送的數據。那是我唯一的擔心。謝謝你的時間。 :) – killer

相關問題