-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;
}
}
}
我真的很感激,如果有人可以讓我知道爲什麼有內存泄漏。我真的很喜歡這些東西。
它對我來說很好。你有沒有使用類似'valgrind'的工具來確定是否有泄漏?我想你可能只是看到了內存碎片的結果。 – Barmar 2015-02-06 01:13:18
我認爲泄漏更可能是在您的代碼中,而不是在語言本身。 – nhgrif 2015-02-06 01:16:06
規則#1:確保每個代碼路徑的每個'new'都有一個匹配的'delete'。規則#0:將你的'new'和'delete'封裝到RAII設施中,最好是通過庫或者你自己來封裝,這樣#1就自動實現了。規則#-1:不要做不必要的動態分配,因此#1和#0是不必要的。 – 2015-02-06 01:25:31