2

我想初始化一个包含指向课程指针的向量向量。我宣布了这一点:

std::vector<std::vector<Course*> > *CSPlan = 
        new std::vector<std::vector<Course*> >(smsNum);

我想要做的是有一个向量向量,每个内部向量都是一个包含指向 Courses 的指针的向量,我希望 MAIN 向量的大小为int smsNum。此外,我希望它在堆上。

我的问题是:

  1. 主向量和内部向量是否都分配在堆上?还是只有 MAIN 向量在堆上,它的索引是指向堆栈上其他较小向量的指针?

  2. 我声明它的大小int smsNum,所以主向量的大小是 10,但是较小的向量呢?它们也有那么大,还是仍然是动态的?

我最终的目标是在堆上有一个向量向量,主向量和子向量都在堆上,只有主向量的大小为 smsNum,其余的都是动态的。

4

1 回答 1

4

任何可以增长到用户想要的大小的结构都将在堆上分配。另一方面,内存堆栈用于分配静态分配的变量,程序在编译过程中可以静态控制大小。

因为你可以有这样的循环:

for (i = 0; i < your_value; i++) {
    vector.insert(...);
}

考虑your_value到从标准输入读取的整数,编译器无法控制向量的大小,即它不知道您可以执行的最大插入量是多少。

为了解决这个问题,结构必须在堆上分配,它可能会增长到操作系统允许的大小——考虑到主内存和交换。作为补充,如果您使用指向向量的指针,您将简单地动态分配一个变量来引用该向量。这不会改变向量的内容必须在堆上分配的事实。

您将在您的堆栈中拥有:

  • 存储变量“y”地址的变量“x”;

在你的堆里:

  • 变量“y”的值,即对向量向量的引用;

  • 您的向量向量的内容(由“y”访问,由“x”访问)。

于 2012-11-18T12:16:04.200 回答