C++ a";的所有成员变量;新";创建的实例是否存在于堆上而不是堆栈上?

C++ a";的所有成员变量;新";创建的实例是否存在于堆上而不是堆栈上?,c++,class,oop,memory-management,C++,Class,Oop,Memory Management,这个标题并没有真正做到这一点 那么,如果我使用new创建一个类(在本例中是球场,就像在高尔夫球场中一样),那么它是在堆上创建的,并且球场包含一个洞向量,另一个类,这个向量必须是一个洞向量*才能在堆上吗 class course { public: course(std::string file); private: std::string name; std::vector<hole> holes; }; class

这个标题并没有真正做到这一点

那么,如果我使用new创建一个类(在本例中是球场,就像在高尔夫球场中一样),那么它是在堆上创建的,并且球场包含一个洞向量,另一个类,这个向量必须是一个洞向量*才能在堆上吗

class course {
    public:
        course(std::string file);

    private:
        std::string name;
        std::vector<hole> holes;
};

class hole {
    public:
        hole(std::string data);

    private:
        std::vector<vec3> vertices;
        std::vector<int> triIndex;
        std::vector<int> boundaryIndex;
};

course currentCourse = new course("datafile.dat");
课程{
公众:
课程(std::字符串文件);
私人:
std::字符串名;
std::向量孔;
};
班级洞{
公众:
孔(标准:字符串数据);
私人:
向量顶点;
std::向量三指数;
向量边界索引;
};
课程currentCourse=新课程(“datafile.dat”);
我的假设是,如果课程在堆上,那么所有成员当然也会在堆上,但我现在怀疑自己,是的,这是分配的一部分,我必须考虑内存管理-我以前从未遇到过这种情况,我甚至不确定如何测试变量是否在堆栈内存或堆内存中

我真的希望我已经把这个问题说清楚了,因为我在措辞上有困难,因此搜索没有多大帮助:(如果人们能给我指出正确的方向,我非常乐意发布更新

向量必须是孔的向量吗*

否。
std::vector
是一个使用动态(堆)内存的容器(这同样适用于
std::string
)。如果您使用了在堆栈上分配的容器,答案仍然是否,因为您的假设是这样的

如果进程在堆上,那么所有成员当然也会在堆上

这是正确的

在您的情况下,不需要
新的
。您可以简单地:

course myCourse("datafile.dat")
小结:

struct S
{
    void f() { int a = 0; /* local variable a is always on the stack */ }
    int _i = 1; // stack or heap depending on whether the instance of S
                // is on the stack or on the heap
    std::vector<int> _v; // always uses heap (small std::vector's could store their contents
                         // on the stack, but I'll consider that out of scope)
};
结构
{
void f(){int a=0;/*局部变量a始终在堆栈上*/}
int _i=1;//堆栈或堆取决于
//是在堆栈上还是在堆上
std::vector _v;//始终使用堆(小型std::vector可以存储其内容
//在堆栈上,但我会考虑超出范围
};
请注意,如果
S
的实例在堆栈上,则成员
\u v
在堆栈上。但是,存储在
\u v
中的内容在堆栈上

向量必须是孔的向量吗*

否。
std::vector
是一个使用动态(堆)内存的容器(这同样适用于
std::string
)。如果您使用了在堆栈上分配的容器,答案仍然是否,因为您的假设是这样的

如果进程在堆上,那么所有成员当然也会在堆上

这是正确的

在您的情况下,不需要
新的
。您可以简单地:

course myCourse("datafile.dat")
小结:

struct S
{
    void f() { int a = 0; /* local variable a is always on the stack */ }
    int _i = 1; // stack or heap depending on whether the instance of S
                // is on the stack or on the heap
    std::vector<int> _v; // always uses heap (small std::vector's could store their contents
                         // on the stack, but I'll consider that out of scope)
};
结构
{
void f(){int a=0;/*局部变量a始终在堆栈上*/}
int _i=1;//堆栈或堆取决于
//是在堆栈上还是在堆上
std::vector _v;//始终使用堆(小型std::vector可以存储其内容
//在堆栈上,但我会考虑超出范围
};

请注意,如果
\u v
的实例在堆栈上,则成员
\u v
在堆栈上。但是,存储在
\u v
中的内容在堆上。

此“分配的一部分”实际说明或具体要求什么?随附报告的内存管理部分要求“在本节中描述如何在开发中管理内存,以应对可伸缩性(例如100名玩家、20门课程等)问题,并提供详细的图表和/或代码示例(约0.5页)”我知道动态或大型数据集应该在堆上创建,而较小的数据集可以留在堆栈上(实际上可能更快)。在这个“内存管理部分”中,我看不到任何东西需要深入到这样的细节中。在我看来,“X是通过使用向量来管理的。”“就足够了。是的,您是对的。如果您使用
new
分配内存,则类的每个成员都将驻留在堆上。请注意,向量的直接内容将仅是内存簿记(如其大小)。向量将为实际数据分配更多堆内存,而不管向量是驻留在堆栈上还是堆上。切向相关:更喜欢术语“动态内存”而不是“堆”堆是一个几乎通用的动态内存的实现,但是C++可以使用PIXE灰尘和仓鼠轮,如果它们可以满足要求。类似的是“自动内存”到“栈”。通常这不重要,但是它可以,例如,在一个考试中。这是“任务的一部分”。具体说明或要求?随附报告的内存管理部分要求“在本节中描述如何在开发中管理内存,以应对可扩展性(例如100名玩家、20门课程等)问题,并提供详细的图表和/或代码示例(约0.5页)”我知道动态或大型数据集应该在堆上创建,而较小的数据集可以留在堆栈上(实际上可能更快)。在这个“内存管理部分”中,我看不到有任何东西需要深入到这些细节。在我看来,“X是用向量管理的”就足够了。是的,您是对的。如果您使用
new
分配内存,则类的每个成员都将驻留在堆上。请注意,向量的直接内容将仅是内存簿记(如其大小)该向量将为实际数据分配更多堆内存,而不管向量是否存在于堆栈或堆上。切切相关:更喜欢“动态内存”一词“堆”。堆是一种几乎通用的动态内存的实现,但C++。