gpt4 book ai didi

c++ - 使用winsock发送缓冲区后是否可以删除内存?

转载 作者:可可西里 更新时间:2023-11-01 11:24:30 25 4
gpt4 key购买 nike

我有一个程序需要将缓冲区发送到套接字。我的问题是我可以在调用 Winsock->send() 方法后立即删除缓冲区吗?

我提出这个问题的原因:我使用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];
};

请提出任何可能的解决方案。谢谢。

最佳答案

它可能指的是你在 BuildPacket 中的 new 因为你没有 delete 它但是你确实将它分配给另一个指针并且得到已解除分配,因此很可能是误报。

但是,更麻烦的是您的代码中有未定义的行为,即:

void* ref = NULL;
delete ref;

void* 上调用 delete 是未定义的行为,你应该在删除它之前转换它。

关于c++ - 使用winsock发送缓冲区后是否可以删除内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43999790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com