如何使用动态调整大小的字符串数组?

时间:2013-10-27 21:31:04

标签: c++ arrays string dynamic

我试图在C ++中使用大小变化的数组。由于某种原因,大小不会改变,它只持有1个字符串。困难的部分是用户无法输入他们要添加的课程数量,而是在用户停止之前调用addCourse函数。无法使用向量(这适用于学校作业,需要调整大小数组)。我坚持为什么数组似乎只有一个字符串,我认为它保持相当于numCourses字符串。在每次调用函数后,我如何调整大小以保存多个字符串?

void Student::addCourse(string* courseName)
{
    int x;
    numCourses += 1;//increments number of courses

    string newCourse = *courseName;

    string* newCourses = new string[numCourses];//temporary array

    for(x=0; x<numCourses - 1; x++)//fills temp array with the values of the old
    {
        newCourses[x] = courses[x];
    }

    newCourses[numCourses - 1] = newCourse;//adds extra value

    delete[] courses;//removes original array

    courses = newCourses;//sets the new course list
}

编辑:对于那些询问无法使用向量的人,因为赋值的目的是使用堆主动避免内存泄漏。使用这样的数组会强制有意删除存储的值。

2 个答案:

答案 0 :(得分:1)

注释应该已经回答了你的问题:调试器无法知道指向字符串的指针指向数组,也不知道它的边界,因为在运行时没有保留这样的信息(std相反,:: vector将在调试器中显示其全部内容。

答案 1 :(得分:0)

您的方法原型应为:

void Student::addCourse(const string& courseName);

如果您不想发生内存泄漏,请声明指向您班级课程的指针:

private:
    string* courses;

在构造函数中为一个字符串数组分配空间:

Student::Student() 
{
    courses = new String[5];
}

然后在析构函数中释放:     学生::〜学生()     {         删除[]课程;     }

这为您提供最多5个课程的空间。如果需要更多,则需要在运行时调整字符串数组的大小:

void Student::ExtendArray()
{
    delete[] courses;
    courses = new String[10];
}

请注意,此代码不是异常安全的,但会为您提供基本的想法。