2015-08-15 278 views
0

您好我有一个类它包含结构的一些阵列在报头被定义为以下的是:内存泄漏

struct ball 
{ 
    int* time; 
    float* x; 
    float* y; 
    float* vx; 
    float* vy; 
}*Ball; 

struct team 
{ 
    int* time; 
    char* side; 
    int* unum; 
    int* type; 
    int* state; 
    float* x; 
    float* y; 
    float* vx; 
    float* vy; 
    float* body_angle; 
    float* head_angle; 
}**TeamLeft, **TeamRight; 

struct teamscore 
{  
    string name_l; 
    string name_r; 
    int* time; 
    int* score_l; 
    int* score_r; 
    int* pen_score_l; 
    int* pen_score_r; 
    int* pen_miss_l; 
    int* pen_miss_r; 
}*TeamScore; 

int** playmode; 

在构造存储器分配为以下和执行然后将结构填充所需的初始值:

Ball = new ball[file_num]; 
TeamScore = new teamscore[file_num]; 
TeamLeft = new team*[file_num]; 
TeamRight = new team*[file_num]; 
playmode = new int*[file_num]; 

for (int i = 0; i < file_num; i++) 
{ 
    Ball[i].time = new int[frames_num]; 
    Ball[i].x = new float[frames_num]; 
    Ball[i].y = new float[frames_num]; 
    Ball[i].vx = new float[frames_num]; 
    Ball[i].vy = new float[frames_num]; 

    TeamLeft[i] = new team[11]; 
    TeamRight[i] = new team[11]; 

    TeamScore[i].time = new int[frames_num]; 
    TeamScore[i].score_l = new int[frames_num]; 
    TeamScore[i].score_r = new int[frames_num]; 
    TeamScore[i].pen_score_l = new int[frames_num]; 
    TeamScore[i].pen_score_r = new int[frames_num]; 
    TeamScore[i].pen_miss_l = new int[frames_num]; 
    TeamScore[i].pen_miss_r = new int[frames_num]; 

    playmode[i] = new int[frames_num]; 

    for (int j = 0; j < 11; j++) 
    { 
     TeamLeft[i][j].time = new int[frames_num]; 
     TeamLeft[i][j].side = new char[frames_num]; 
     TeamLeft[i][j].unum = new int[frames_num]; 
     TeamLeft[i][j].type = new int[frames_num]; 
     TeamLeft[i][j].state = new int[frames_num]; 
     TeamLeft[i][j].x = new float[frames_num]; 
     TeamLeft[i][j].y = new float[frames_num]; 
     TeamLeft[i][j].vx = new float[frames_num]; 
     TeamLeft[i][j].vy = new float[frames_num]; 
     TeamLeft[i][j].body_angle = new float[frames_num]; 
     TeamLeft[i][j].head_angle = new float[frames_num]; 

     TeamRight[i][j].time = new int[frames_num]; 
     TeamRight[i][j].side = new char[frames_num]; 
     TeamRight[i][j].unum = new int[frames_num]; 
     TeamRight[i][j].type = new int[frames_num]; 
     TeamRight[i][j].state = new int[frames_num]; 
     TeamRight[i][j].x = new float[frames_num]; 
     TeamRight[i][j].y = new float[frames_num]; 
     TeamRight[i][j].vx = new float[frames_num]; 
     TeamRight[i][j].vy = new float[frames_num]; 
     TeamRight[i][j].body_angle = new float[frames_num]; 
     TeamRight[i][j].head_angle = new float[frames_num]; 
    } 
} 

for (int Fi = 0; Fi < file_num; Fi++) 
{ 
    TeamScore[Fi].name_l = "None"; 
    TeamScore[Fi].name_r = "None"; 
    for (int Fr = 0; Fr < frames_num; Fr++) 
    { 

     Ball[Fi].time[Fr] = 0; 
     Ball[Fi].x[Fr] = 0; 
     Ball[Fi].y[Fr] = 0; 
     Ball[Fi].vx[Fr] = 0; 
     Ball[Fi].vy[Fr] = 0; 

     TeamScore[Fi].time[Fr] = 0; 
     TeamScore[Fi].score_l[Fr] = 0; 
     TeamScore[Fi].score_r[Fr] = 0; 
     TeamScore[Fi].pen_score_l[Fr] = 0; 
     TeamScore[Fi].pen_score_r[Fr] = 0; 
     TeamScore[Fi].pen_miss_l[Fr] = 0; 
     TeamScore[Fi].pen_miss_r[Fr] = 0; 

     playmode[Fi][Fr] = 0;   

     for (int Ti = 0; Ti < 11; Ti++) 
     { 
      TeamLeft[Fi][Ti].time[Fr] = 0; 
      TeamLeft[Fi][Ti].side[Fr] = 'L'; 
      TeamLeft[Fi][Ti].unum[Fr] = 0; 
      TeamLeft[Fi][Ti].type[Fr] = 0; 
      TeamLeft[Fi][Ti].state[Fr] = 0; 
      TeamLeft[Fi][Ti].x[Fr] = 0; 
      TeamLeft[Fi][Ti].y[Fr] = 0; 
      TeamLeft[Fi][Ti].vx[Fr] = 0; 
      TeamLeft[Fi][Ti].vy[Fr] = 0; 
      TeamLeft[Fi][Ti].body_angle[Fr] = 0; 
      TeamLeft[Fi][Ti].head_angle[Fr] = 0; 

      TeamRight[Fi][Ti].time[Fr] = 0; 
      TeamRight[Fi][Ti].side[Fr] = 'R'; 
      TeamRight[Fi][Ti].unum[Fr] = 0; 
      TeamRight[Fi][Ti].type[Fr] = 0; 
      TeamRight[Fi][Ti].state[Fr] = 0; 
      TeamRight[Fi][Ti].x[Fr] = 0; 
      TeamRight[Fi][Ti].y[Fr] = 0; 
      TeamRight[Fi][Ti].vx[Fr] = 0; 
      TeamRight[Fi][Ti].vy[Fr] = 0; 
      TeamRight[Fi][Ti].body_angle[Fr] = 0; 
      TeamRight[Fi][Ti].head_angle[Fr] = 0; 
     } 
    } 
} 

在析构函数指针被删除如下:

for (int i = 0; i < file_num; i++) 
    {  
     for (int j = 0; j < 11; j++) 
     { 
      delete TeamLeft[i][j].time; 
      delete TeamLeft[i][j].side; 
      delete TeamLeft[i][j].unum; 
      delete TeamLeft[i][j].type; 
      delete TeamLeft[i][j].state; 
      delete TeamLeft[i][j].x; 
      delete TeamLeft[i][j].y; 
      delete TeamLeft[i][j].vx; 
      delete TeamLeft[i][j].vy; 
      delete TeamLeft[i][j].body_angle; 
      delete TeamLeft[i][j].head_angle; 

      delete TeamRight[i][j].time; 
      delete TeamRight[i][j].side; 
      delete TeamRight[i][j].unum; 
      delete TeamRight[i][j].type; 
      delete TeamRight[i][j].state; 
      delete TeamRight[i][j].x; 
      delete TeamRight[i][j].y; 
      delete TeamRight[i][j].vx; 
      delete TeamRight[i][j].vy; 
      delete TeamRight[i][j].body_angle; 
      delete TeamRight[i][j].head_angle; 
     } 
    } 
    for (int i = 0; i < file_num; i++) 
    { 
     delete Ball[i].time; 
     delete Ball[i].x; 
     delete Ball[i].y; 
     delete Ball[i].vx; 
     delete Ball[i].vy; 

     delete TeamLeft[i]; 
     delete TeamRight[i]; 

     delete TeamScore[i].time;  
     delete TeamScore[i].score_l;   
     delete TeamScore[i].score_r; 
     delete TeamScore[i].pen_score_l; 
     delete TeamScore[i].pen_score_r; 
     delete TeamScore[i].pen_miss_l; 
     delete TeamScore[i].pen_miss_r; 

     delete playmode[i]; 

    } 

    delete Ball; 
    delete [] TeamScore; 
    delete TeamLeft; 
    delete TeamRight; 
    delete playmode; 

还是有内存泄漏,我在任务管理器中测试过。如果大数组被创建并销毁,程序将使用所有可用的RAM,程序将以未处理的错误终止。如果有人能帮我解析器的问题,我将不胜感激。

============================================== =========================== 更新析构函数的版本,将正确删除所有分配的回忆是:

for (int i = 0; i < file_num; i++) 
    { 

     for (int j = 0; j < 11; j++) 
     { 
      delete[] TeamLeft[i][j].time; 
      delete[] TeamLeft[i][j].side; 
      delete[] TeamLeft[i][j].unum; 
      delete[] TeamLeft[i][j].type; 
      delete[] TeamLeft[i][j].state; 
      delete[] TeamLeft[i][j].x; 
      delete[] TeamLeft[i][j].y; 
      delete[] TeamLeft[i][j].vx; 
      delete[] TeamLeft[i][j].vy; 
      delete[] TeamLeft[i][j].body_angle; 
      delete[] TeamLeft[i][j].head_angle; 

      delete[] TeamRight[i][j].time; 
      delete[] TeamRight[i][j].side; 
      delete[] TeamRight[i][j].unum; 
      delete[] TeamRight[i][j].type; 
      delete[] TeamRight[i][j].state; 
      delete[] TeamRight[i][j].x; 
      delete[] TeamRight[i][j].y; 
      delete[] TeamRight[i][j].vx; 
      delete[] TeamRight[i][j].vy; 
      delete[] TeamRight[i][j].body_angle; 
      delete[] TeamRight[i][j].head_angle; 
     } 
    } 
    for (int i = 0; i < file_num; i++) 
    { 

     delete[] Ball[i].time; 
     delete[] Ball[i].x; 
     delete[] Ball[i].y; 
     delete[] Ball[i].vx; 
     delete[] Ball[i].vy; 

     delete[] TeamLeft[i]; 
     delete[] TeamRight[i]; 

     delete[] TeamScore[i].time; 
     delete[] TeamScore[i].score_l; 
     delete[] TeamScore[i].score_r; 
     delete[] TeamScore[i].pen_score_l; 
     delete[] TeamScore[i].pen_score_r; 
     delete[] TeamScore[i].pen_miss_l; 
     delete[] TeamScore[i].pen_miss_r; 

     delete[] playmode[i]; 

    } 

    delete[] Ball; 
    delete[] TeamScore; 
    delete[] TeamLeft; 
    delete[] TeamRight; 
    delete[] playmode; 
} 
+7

你真的不必在C++中编写这样复杂的代码。查看标准库容器,如'std :: vector'。 – juanchopanza

+4

哦,我的上帝......什么是所有的指针和“新”和“删除”....这是可怕的!难怪你有内存管理问题...... –

+2

除了眼屎造物之外,“我在任务管理器中测试过它” - 应该是* last *用于确定内存泄漏的东西列表在Windows上。您应该使用[CRT内存设施](https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx)。我还不清楚为什么'Features'甚至被提及* *,因为它在ctor或dtor中都没有明显的用法。 – WhozCraig

回答

2

外貌像你这样的分配阵列喜欢这里:

TeamLeft[i][j].time = new int[frames_num]; 

,但您使用不正确删除方法:

delete TeamLeft[i][j].time; 

您需要将其作为数组删除:

delete [] TeamLeft[i][j].time; 

和其他所有数组都应该删除相似。

P.S.请考虑使用std::vector而不是动态数组。它会为你节省很多小时的头痛:)

+0

谢谢但内存泄漏仍然存在。我怀疑一些内部指针没有正确删除,但无法确定它们在哪里。我把初始化程序和析构函数放在一个循环中,memroy变得完全透明。 – Alireza

+0

我知道矢量设施,但想了解这个代码的问题,我在C之前使用这样的指针创建和删除,并没有发生问题。 – Alireza

+0

首先确保你没有错过任何数组,并且用'[]'正确地删除了所有数组。当你有这么多种'新'的电话时,我会假设你错过了某处的'delete'或'delete []'。第二件事,请不要明确地调用析构函数!使用'myObj = new Game();'然后'删除myObj;' –