【发布时间】:2015-02-06 01:08:36
【问题描述】:
我正在实现一个类来存储属于某个类的学生列表。由于我使用char 数组来存储信息,因此我必须经常调整二维数组的大小。
但是,在我的测试软件中,当我调用以下两行(参见第 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;
}
}
}
如果有人能告诉我为什么会出现内存泄漏,我将不胜感激。我真的很讨厌这些东西。
【问题讨论】:
-
我认为泄漏更有可能是您的代码而不是语言本身。
-
规则 #1:确保每个代码路径的每个
new都有一个匹配的delete。规则 #0:将您的new和delete封装到 RAII 设施中,最好通过库或您自己,以便自动实现 #1。规则 #-1:不要进行不必要的动态分配,这样就不需要 #1 和 #0。 -
请发布一个 main() 程序,看看你是如何使用你的类的。我可以使用 3 行 main() 程序轻松地在您的代码中创建泄漏。
-
你的 StudentClass 析构函数是做什么的? (如果它没有做正确的事情,那会导致你的 for 循环的每次迭代都发生内存泄漏)
-
您是否考虑过使用预建工具,例如
std::vector和std::string?即使您想自己实现该行为,您也应该为每个资源使用一个对象并确保它们自行清理
标签: c++ arrays memory-leaks char