2

我正在尝试在 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
}

编辑:对于那些询问为什么不能使用向量的人,因为分配的重点是积极避免使用堆的内存泄漏。使用这样的数组会强制有意删除存储的值。

4

2 回答 2

1

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

于 2013-10-27T22:45:46.457 回答
0

您的方法原型应为:

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

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

private:
    string* courses;

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

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

然后在析构函数中释放: Student::~Student() { delete[] courses; }

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

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

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

于 2013-10-27T22:58:32.767 回答