2015-08-15 280 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;' –