何时以及为何在堆C++上声明成员变量

Ben*_*xon 15 c++ heap class member-variables

好的,所以我对C++编程非常陌生,而且我已经花了几天的时间来寻找一个决定性的答案.什么时候我应该在堆与堆栈上声明成员变量?我发现的大多数答案都涉及其他问题,但我想知道何时最好将堆用于成员变量,以及为什么最好堆积成员而不是堆叠它们.

Oli*_*rth 19

首先要掌握两个重要概念:

  1. 人们应该避免考虑"堆"和"堆栈".这些是编译器/平台的实现细节,而不是语言的实现细节.1 相反,从对象生命周期的角度思考:对象的生命周期应该与其"父"的生命周期相对应,还是应该比它的寿命更长?如果您需要后者,那么您将需要new(直接或间接)使用动态分配对象.

  2. 成员变量的生命周期始终与父项相同.成员变量可以是指针,它指向的对象可能具有独立的生命周期.但是指向对象不是成员变量.

但是,您的问题没有一般性答案.粗略地说,除非有充分的理由,否则不要动态分配.正如我上面所暗示的,这些原因通常对应于生命周期需要与其"父母"不同的情况.


事实上,C++标准并没有真正谈论"堆"和"堆栈".在优化或一般考虑性能时,它们很重要,但从程序功能的角度来看,它们大多无关紧要.


Jam*_*nze 5

成员变量是类本身的成员。它们既不在堆上也不在堆栈上,或者更确切地说,它们位于类本身所在的位置。

添加一个间接级别并在堆上单独分配成员的原因很少:多态性(如果成员的类型不总是相同)是迄今为止最常见的。