2013-11-20 80 views
1

我有关于删除我的项目中的动态数组的问题。删除动态数组?

首先出现:

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大小的数组会导致内存泄漏?

+0

您是否遵循[三规则](http://en.wikipedia.org/wiki/Rule_of_three_%28C++_programming%29)? – juanchopanza

+2

*旁白*:除非你被要求在这里使用'new'和'delete',**不要**。 'std :: vector'明显优于这种方法。 –

+0

'courses = new Course [0];'??为什么0,你想用一个大小为0的数组做什么? – Johan

回答

2

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

要么执行或删除复制功能,要么(更好的是)不要自己管理资源:使用std::vector<Course>为您完成工作。如果你这样做,你不需要析构函数,并且addCourse会简单得多。

0

要么将​​一个类型为StudentReviewSystem的对象分配给另一个相同类型的对象,而不明确定义复制赋值运算符(或复制构造函数),否则编译器在分配零长度数组时有bug。