C/C++;客户端上的Winsock UDP-sendto()导致内存泄漏 我用C++编写了一个网络游戏,使用Winsock UDP套接字,每次调用SeNTO()时都会出现一个问题,它会以不可逆转的方式增加内存使用。最奇怪的是,它只出现在客户机上,服务器上没有问题,即使它使用几乎相同的网络代码

C/C++;客户端上的Winsock UDP-sendto()导致内存泄漏 我用C++编写了一个网络游戏,使用Winsock UDP套接字,每次调用SeNTO()时都会出现一个问题,它会以不可逆转的方式增加内存使用。最奇怪的是,它只出现在客户机上,服务器上没有问题,即使它使用几乎相同的网络代码,c++,memory,udp,winsock,memory-leaks,C++,Memory,Udp,Winsock,Memory Leaks,下面是创建连接的客户机类的构造函数(我无法显示整个代码,因为它要大得多,而且不是开源项目): 以及向服务器发送数据的功能: void sendCRequest(){ int sum = 0; unsigned char c1,c2,c3,c4; if (ludzie[0].ster[S_RIGHT]) sum+=1; if (ludzie[0].ster[S_LEFT]) sum+=2; if (ludzie[0].ster[S_UP]) sum+=4; if (ludzie[0].ster[

下面是创建连接的客户机类的构造函数(我无法显示整个代码,因为它要大得多,而且不是开源项目):

以及向服务器发送数据的功能:

void sendCRequest(){
int sum = 0;
unsigned char c1,c2,c3,c4;

if (ludzie[0].ster[S_RIGHT]) sum+=1;
if (ludzie[0].ster[S_LEFT]) sum+=2;
if (ludzie[0].ster[S_UP]) sum+=4;
if (ludzie[0].ster[S_DOWN]) sum+=8;
if (ludzie[0].ster[S_RUN]) sum+=16;
if (ludzie[0].ster[S_ENTER]) sum+=32;
if (ludzie[0].ster[S_SHOT]) sum+=64;
if (ludzie[0].ster[S_RELOAD]) sum+=128;

if (ludzie[0].ster[S_SHOT]){
    float depth;
    GLdouble modelMatrix [16];
    GLdouble projMatrix [16];
    GLdouble dx,dy,dz;
    GLint viewport [4];

    glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
    glGetIntegerv(GL_VIEWPORT,viewport);
    glReadPixels( mx, screendy*2-my, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
    gluUnProject(mx,screendy*2-my,depth,modelMatrix,projMatrix,viewport,&dx,&dy,&dz);

    //x
    floatEnc(dx,&c1,&c2,&c3,&c4);
    data[16]=c1; data[17]=c2; data[18]=c3; data[19]=c4;
    //y
    floatEnc(dy,&c1,&c2,&c3,&c4);
    data[20]=c1; data[21]=c2; data[22]=c3; data[23]=c4;
    //z
    floatEnc(dz,&c1,&c2,&c3,&c4);
    data[24]=c1; data[25]=c2; data[26]=c3; data[27]=c4;
}

data[0] = 'C';
for (int i=1;i<9;i++) data[i]=auth[i-1];
data[10] = (char)sum;
data[11]=ludzie[0].ster[S_SPACE]?'1':'0';
floatEnc(ludzie[0].r,&c1,&c2,&c3,&c4);
data[12]=c1; data[13]=c2; data[14]=c3; data[15]=c4;
sendto(sd, data, RQBUFFER, 0, (struct sockaddr *)&server, server_length);
}
void sendCRequest(){
整数和=0;
无符号字符c1、c2、c3、c4;
if(ludzie[0].ster[S_RIGHT])和+=1;
if(ludzie[0].ster[S_左])和+=2;
if(ludzie[0].ster[S_UP])和=4;
if(ludzie[0].ster[S_DOWN])和+=8;
if(ludzie[0].ster[S_RUN])和=16;
如果(ludzie[0].ster[S_ENTER])和+=32;
if(ludzie[0].ster[S_SHOT])和+=64;
if(ludzie[0].ster[S_RELOAD])和=128;
如果(ludzie[0].ster[S_SHOT]){
漂浮深度;
GLM双模型矩阵[16];
GLdouble projMatrix[16];
gldx,dy,dz;
闪烁视口[4];
glGetDoublev(GL_模型视图_矩阵,模型矩阵);
glGetDoublev(GL_投影矩阵,projMatrix);
glGetIntegerv(GL_视口,视口);
glReadPixels(mx、screendy*2-my、1、1、GL_深度分量、GL_浮点和深度);
gluUnProject(mx、screendy*2-my、深度、modelMatrix、projMatrix、viewport、&dx、&dy、&dz);
//x
浮动NC(dx、c1、c2、c3和c4);
数据[16]=c1;数据[17]=c2;数据[18]=c3;数据[19]=c4;
//y
浮动NC(dy、c1、c2、c3和c4);
数据[20]=c1;数据[21]=c2;数据[22]=c3;数据[23]=c4;
//z
漂浮物(dz、c1、c2、c3和c4);
数据[24]=c1;数据[25]=c2;数据[26]=c3;数据[27]=c4;
}
数据[0]=“C”;

对于(inti=1;i您在
Client()中确实存在内存泄漏
。你调用
malloc
但没有调用
free
来释放内存。我建议使用
std::vector
来释放内存,或者至少使用
new
delete
。除了你在问题中包含的代码没有其他泄漏之外。我怀疑你有其他代码n执行与
Client()
相同操作的程序-调用
malloc
,而不调用
free
释放内存


至于你认为被
sendto
泄露的内存,你应该知道Winsock库在用户空间中做了很多事情,包括分配内存。Winsock库很可能为各种缓冲区分配内存,并保留它们以备将来使用。

我想在
sendto
服务器发回一些东西,客户端处理数据?这可能是问题吗?泄漏有多大?数据和RQBUFFER的定义是什么?RQBUFFER现在是32,数据是:char data[RQBUFFER];我在服务器关闭的情况下测试了它(没有收到响应)它在客户端被忽略-没有任何更改。在调试器中运行调试生成时,请尝试使用-它将显示泄漏的内存以及在代码中分配的内存位置。它应该有助于跟踪问题。没错,但是client()只调用一次,所以即使有泄漏,它怎么会随时间增加?我主要问的是“用户空间中的很多事情,包括分配内存”以及如何避免它们…首先,您应该检查代码的其余部分,以确保没有泄漏内存。如果您足够粗心,在一个地方这样做,可能会发生在其他地方。由于您无法控制Winsock库或其加载的第三方DLL的内部工作,因此无法阻止它分配缓冲区eds.I检查了其他所有内容,也以这种方式:服务器关闭(数据包不在任何地方,没有接收/处理,除了这些直接由sendto引起的后果外)在结尾处有和没有sendto()时没有其他后果-在第一种情况下内存使用率增加(每10秒增加一次约1MB),在第二种情况下内存使用率是恒定的(上下变化很小,但不是无限大)。也可以仅在按下某个键时调用sendto-在本例中:按下时增加,不按下时不增加。还尝试了以下方法:while(1){sendto(sd,data,RQBUFFER,0,(struct sockaddr*)和server,server_length);}-相同的泄漏,但速度快了100倍。很明显,这个sendto本身就是问题所在。如果像“sendto”这样的Windows/Winsock函数出现内存泄漏,我怀疑以前会有人注意到,即几十年前。现在没有合理的理由相信会有这样的问题。
void sendCRequest(){
int sum = 0;
unsigned char c1,c2,c3,c4;

if (ludzie[0].ster[S_RIGHT]) sum+=1;
if (ludzie[0].ster[S_LEFT]) sum+=2;
if (ludzie[0].ster[S_UP]) sum+=4;
if (ludzie[0].ster[S_DOWN]) sum+=8;
if (ludzie[0].ster[S_RUN]) sum+=16;
if (ludzie[0].ster[S_ENTER]) sum+=32;
if (ludzie[0].ster[S_SHOT]) sum+=64;
if (ludzie[0].ster[S_RELOAD]) sum+=128;

if (ludzie[0].ster[S_SHOT]){
    float depth;
    GLdouble modelMatrix [16];
    GLdouble projMatrix [16];
    GLdouble dx,dy,dz;
    GLint viewport [4];

    glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
    glGetIntegerv(GL_VIEWPORT,viewport);
    glReadPixels( mx, screendy*2-my, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
    gluUnProject(mx,screendy*2-my,depth,modelMatrix,projMatrix,viewport,&dx,&dy,&dz);

    //x
    floatEnc(dx,&c1,&c2,&c3,&c4);
    data[16]=c1; data[17]=c2; data[18]=c3; data[19]=c4;
    //y
    floatEnc(dy,&c1,&c2,&c3,&c4);
    data[20]=c1; data[21]=c2; data[22]=c3; data[23]=c4;
    //z
    floatEnc(dz,&c1,&c2,&c3,&c4);
    data[24]=c1; data[25]=c2; data[26]=c3; data[27]=c4;
}

data[0] = 'C';
for (int i=1;i<9;i++) data[i]=auth[i-1];
data[10] = (char)sum;
data[11]=ludzie[0].ster[S_SPACE]?'1':'0';
floatEnc(ludzie[0].r,&c1,&c2,&c3,&c4);
data[12]=c1; data[13]=c2; data[14]=c3; data[15]=c4;
sendto(sd, data, RQBUFFER, 0, (struct sockaddr *)&server, server_length);
}