2015-02-06 60 views
-2

我正在實現一個類來存儲屬於某個類的學生列表。由於我使用char數組來存儲信息,因此我必須經常調整2D數組的大小。爲什麼會出現內存泄漏C++

但是,在我的測試軟件中,當我調用以下兩行時(請參閱第1節),內存顯着增加。

Section 1 

for(int i = 0; i < 1000;i++) 
{ 
    StudentClass studentClass; 
    studentClass.resizeArray(1000); 
} 

這是我的頭文件...

#define NAME_SIZE 35 
#define SUBJECT_SIZE 25 

class StudentClass 
{ 
private: 
    char name[NAME_SIZE]; 
    int age; 
    char subject[SUBJECT_SIZE]; 
    int numberOfStudents; 
    char **studentChar; 

public: 
    StudentClass(); 
    ~StudentClass(); 

    void setStudentName(char *name); 
    void setStudentAge(int age); 
    void setStudentSubject(char *subject); 
    void resizeArray(int n); 
} 

這是函數給內存泄漏......

void StudentClass::resizeArray(int n) 
{ 
    int i; 
    int newStudentName=1; 
    char **temp; 
    if(n < 0) 
    { 
     cerr << "Number of students within a class can't be less than 0" << endl; 
    } 
    else if(n == numberOfStudents) 
    { 
     return; 
    } 
    else if(n == 0) 
    { 
     for (i=0; i<numberOfStudents; i++) 
     { 
      delete[] studentChar[i]; 
     } 

     delete[] studentChar; 
     studentChar = NULL; 
     numberOfStudents = 0; 
    } 
    else 
    { 
     temp = new char*[n]; 
     if(n < numberOfStudents) 
     { 
      for (i=0; i<n; i++) 
      { 
       temp[i] = studentChar[i]; 
      } 

      for (; i<numberOfStudents; i++) 
      { 
       delete[] studentChar[i]; 
      } 

      delete[] studentChar; 
      studentChar = temp; 
      numberOfStudents = n; 
     } 
     else 
     { 
      for (i=0; i<numberOfStudents; i++) 
      { 
       temp[i] = studentChar[i]; 
      } 

      for (; i<n; i++) 
      { 
       temp[i] = new char[128]; 
       sprintf(temp[i], "NewStudent_%02d", newStudentName++); 
      } 

      delete[] studentChar; 
      studentChar = temp; 
      numberOfStudents = n; 
     } 
    } 
} 

我真的很感激,如果有人可以讓我知道爲什麼有內存泄漏。我真的很喜歡這些東西。

+0

它對我來說很好。你有沒有使用類似'valgrind'的工具來確定是否有泄漏?我想你可能只是看到了內存碎片的結果。 – Barmar 2015-02-06 01:13:18

+2

我認爲泄漏更可能是在您的代碼中,而不是在語言本身。 – nhgrif 2015-02-06 01:16:06

+1

規則#1:確保每個代碼路徑的每個'new'都有一個匹配的'delete'。規則#0:將你的'new'和'delete'封裝到RAII設施中,最好是通過庫或者你自己來封裝,這樣#1就自動實現了。規則#-1:不要做不必要的動態分配,因此#1和#0是不必要的。 – 2015-02-06 01:25:31

回答

0

剛試過你的代碼Deleaker並得到了以下(a link to full sized image):

Leaks

釋放在析構函數的內存後,沒有更多的內存泄漏(任務管理器證明了這一點):

~StudentClass() 
{ 
    resizeArray(0); 
}