C++ 类私有数据-在堆栈或堆上

C++ 类私有数据-在堆栈或堆上,c++,stack,heap,C++,Stack,Heap,在以下代码中: class Array { public: int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; } private: int data[100]; }; int main() { Array a; a[10] = 42; a[12] += a[13]; ... } (如果我错了,请纠正我)数组类型的变量位于堆栈上,因为没

在以下代码中:

class Array {
   public:
      int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; }
   private:
      int data[100];
};

int main()
{
   Array a;
   a[10] = 42;
   a[12] += a[13];
   ...
}
(如果我错了,请纠正我)数组类型的变量位于堆栈上,因为没有使用new来分配它。数组类具有int数据[100],运算符重载返回对数据中特定索引的引用

推荐

我的问题是int数据[100]是在堆栈上还是在堆上?我认为它不应该是堆栈,否则像上面那样的引用如何返回仍然有效


谢谢。

它在堆栈上,因为正如您所注意到的,
在堆栈上分配了一个

堆栈就像堆一样是内存;您可以返回对其中一部分的引用,就像在堆上分配内存一样。唯一的区别在于如何管理内存

唯一需要注意的是不要访问已释放的内存;对于堆栈,这发生在
a
范围的末尾,而堆分配的数据必须被显式删除


在您提到的问题中,对堆栈上声明的变量的引用是从函数返回的;在这种情况下,当函数退出时,变量被销毁,这就是代码出错的原因。然而,在您的例子中,您返回了对
数据
的一部分的引用,该数据的生存期与
数组
对象的生存期相匹配;因此,只要
a
没有被销毁,就可以安全地以这种方式访问它的数据。

它在堆栈上。为什么引用返回会成为一个问题?您可以毫无问题地创建和使用对堆栈上事物的引用

void foo(void)
{
 int i;
 int& j = i; // reference to variable on the stack
 j = 2;
}

您认为这里可能存在什么问题?

它将在堆栈上。如果您试图在“a”超出范围后使用该引用,您将得到未定义的行为。希望它很快就会崩溃

我的问题是int数据[100]是在堆栈上还是在堆上?我认为它不应该是堆栈,否则像上面那样的引用如何返回仍然有效

它分配了自动存储持续时间,即堆栈,而不是堆。您没有动态分配任何内容,因此不会发生动态(堆)分配。这将是一件可怕的事情,而C++完全不为你不使用的东西付费。
如果
数据
已离开其声明范围,即
数组
实例的范围,则对
数据
的元素或
数据
本身的引用将无效。现在,数组类型是否应该使用动态分配?几乎可以肯定,是的,对于通用容器。您有责任确保没有保留指向坏数据的引用或指针。

正如您所说,“数组类型的变量在堆栈上”。从技术上讲,名为
a
的对象位于堆栈上。这意味着对象
a
的所有成员变量都在堆栈上

这意味着返回对成员数组中名为
data
的元素的引用是非常危险的。编译器将允许它,但如果在变量
a
超出范围时尝试访问此引用,则会遇到未定义的行为


在您的示例中,对
操作符[]()
的所有调用都在同一个方法中,因此一切正常。

从技术上讲,名为a的对象是自动分配存储持续时间的。该语言不需要堆栈结构来实现这种存储。只是“技术性的”:D@EdS.感谢您的澄清;-)