【问题标题】:Why is there a memory leak C++为什么会有内存泄漏 C++
【发布时间】: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:将您的 newdelete 封装到 RAII 设施中,最好通过库或您自己,以便自动实现 #1。规则 #-1:不要进行不必要的动态分配,这样就不需要 #1 和 #0。
  • 请发布一个 main() 程序,看看你是如何使用你的类的。我可以使用 3 行 main() 程序轻松地在您的代码中创建泄漏。
  • 你的 StudentClass 析构函数是做什么的? (如果它没有做正确的事情,那会导致你的 for 循环的每次迭代都发生内存泄漏)
  • 您是否考虑过使用预建工具,例如std::vectorstd::string?即使您想自己实现该行为,您也应该为每个资源使用一个对象并确保它们自行清理

标签: c++ arrays memory-leaks char


【解决方案1】:

刚刚使用Deleaker 尝试了您的代码并得到以下结果 (a link to full sized image):

在析构函数中释放内存后,不再有内存泄漏(任务管理器证明了这一点):

~StudentClass()
{
    resizeArray(0);
}

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多