【问题标题】:Deleting dynamic arrays?删除动态数组?
【发布时间】:2013-11-20 16:17:57
【问题描述】:

我在删除项目中的动态数组时遇到问题。

首次出现:

void StudentReviewSystem::addCourse( const int courseId, const string courseName )
{
    int i = findCourse( courseId );

    if ( i == -1 )
    {
        int newNum = numberOfCourses + 1;
        Course *newCourses = new Course[newNum];
        for ( int j = 0; j < numberOfCourses; j++ )
        {
            newCourses[j] = courses[j];
        }
        Course aCourse(courseId, courseName);
        newCourses[numberOfCourses] = aCourse;
        //delete[] courses;
        courses = newCourses;
        numberOfCourses = newNum;
        cout<< "Course "<< courseId <<" has been added."<< endl;
    }
    else
    {
        cout<< "Course "<< courseId <<" has already exist."<< endl;
    }
}

courses 是在我的标题中定义的指针。 如果我注释掉 delete 行,代码就可以正常工作,否则程序会崩溃。

又出现了:

StudentReviewSystem::StudentReviewSystem()
{
    numberOfCourses = 0;
    courses = new Course[0];
}

StudentReviewSystem::~StudentReviewSystem()
{
    //delete[] courses;
}

我知道我必须 delete 我的动态数组以避免内存泄漏,但是每当我的析构函数被调用时,程序就会崩溃,所以我也注释掉了该行。

每当我尝试删除动态数组时,无论我做什么,程序都会崩溃。


事实证明,你不能delete[] 一个大小为 0 的数组。所以,我每次想要 delete 一个数组时都会检查大小。但是 0 大小的数组会导致内存泄漏吗?

【问题讨论】:

  • 你在关注the rule of three吗?
  • Aside:除非您需要在此处使用newdelete,否则不要std::vector 显然优于这种方法。
  • courses = new Course[0]; ??为什么是 0,你想对大小为 0 的数组做什么?
  • 用户将向系统添加课程并且这个数字会增长。最初是 0。

标签: c++ arrays pointers memory-management


【解决方案1】:

如果您的类管理资源,那么您通常需要一个析构函数、复制构造函数和复制赋值运算符,根据 Rule of Three。我的猜测是你没有这些,所以这个类有无效的复制语义:复制它只会复制指针,而不是动态数组,留下两个对象都想删除同一个数组。

实现或删除复制功能,或者(最好)不要自己管理资源:使用std::vector&lt;Course&gt; 为您完成工作。如果你这样做,你也不需要析构函数,addCourse 会简单得多。

【讨论】:

    【解决方案2】:

    要么您将一个 StudentReviewSystem 类型的对象分配给另一个相同类型的对象,而没有显式定义复制赋值运算符(或复制构造函数),要么编译器在分配零长度数组时出现错误。

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2017-05-02
      • 2013-12-25
      • 2016-04-12
      • 2015-09-30
      相关资源
      最近更新 更多