【问题标题】:Heap vs Stack memory usage C++ for dynamically created classes堆与堆栈内存使用 C++ 用于动态创建的类
【发布时间】:2014-03-25 12:48:33
【问题描述】:

如果您在 C++ 中创建一个具有非指针成员变量和非指针成员函数的类,但您动态初始化该类的实例(使用指针),内存使用量来自堆还是堆栈?

对我正在尝试减少堆栈内存的项目的有用信息:)。

非常感谢任何回应。

非常感谢,编码愉快。

【问题讨论】:

    标签: c++ class pointers memory-management


    【解决方案1】:

    如果你使用操作符new 来分配你的类,那么它就会被放到堆上。成员变量是否通过指针访问无关紧要。

    class A {
        int a;
        float* p;
    };
    A* pa = new A(); // required memory is put on the heap
    A a; // required memory is put on the stack
    

    但要小心,因为不是指针访问的每个实例实际上都可能位于堆上。例如:

    A a; // all members are on the stack
    A* pa = &a; // accessed by pointer, but the contents are still not on the heap!
    

    另一方面,位于堆栈上的类实例可能会将其大部分数据放在堆上:

    class B {
    public:
        std::vector<int> data; // vector uses heap storage!
        B() : data(100000) {}
    };
    B b; // b is on the stack, but most of the memory used by it is on the heap
    

    【讨论】:

    • 另外,具有静态存储持续时间的对象(例如全局对象或静态本地对象)在堆上分配
    • 感谢大家的彻底和及时的答复! @king_nak,这是否意味着在函数中调用的对象(不在 main 中)也位于堆上,无论是否使用 new ?
    【解决方案2】:

    如果你使用'new'来创建一个对象,这个对象是在堆中创建的。

    【讨论】:

      【解决方案3】:

      对于指针变量,内存将在stack 中分配,但是当您使用newmalloc 时,该内存段将在heap 中分配

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 2023-03-21
        • 2015-07-02
        • 2011-08-15
        相关资源
        最近更新 更多