【问题标题】:Do all member variables of a "new" created instance exist on the heap rather than the stack?“新”创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
【发布时间】:2020-01-02 02:49:27
【问题描述】:

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

所以,如果我使用 new 创建一个类(在本例中为 Course,如高尔夫球场) - 所以它是在堆上创建的,并且 Course 包含另一个类的 Holes 向量,该向量是否必须是向量Hole* 让他们在堆上?

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");

我的假设是,当然,如果课程在堆上,那么所有成员当然也会在堆上,但我现在怀疑自己,是的,这是任务的一部分,我必须进行内存管理考虑到 - 我以前从未遇到过这种情况,我什至不确定如何测试变量是否在堆栈或堆内存中。

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

【问题讨论】:

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

标签: c++ class oop memory-management


【解决方案1】:

向量必须是Hole*的向量吗?

没有。 std::vector 是一个使用动态(堆)内存的容器(std::string 也是如此)。如果您使用了在堆栈上分配的容器,那么答案仍然是否定的,因为您的假设

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

是正确的。

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

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)
};

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

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2021-08-09
    • 1970-01-01
    • 2013-10-31
    • 2019-09-22
    • 2012-09-12
    • 2021-10-13
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多