C++ 类私有数据-在堆栈或堆上
C++ 类私有数据-在堆栈或堆上,c++,stack,heap,C++,Stack,Heap,在以下代码中:class Array { :int& [] ( i) { if (i > 99) error(); data[i]; } :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:
<p>![堆栈操作_操作系统堆栈 数据结构区别 smth_数组结构与链表结构堆栈队列][1]
int data[100];
};
int main()
{
Array a;
a[10] = 42;
a[12] += a[13];
  ![堆栈操作_数组结构与链表结构堆栈队列_操作系统堆栈 数据结构区别 smth][2]
...
}
</p>
(如果我错了,请纠正我)数组类型的变量位于堆栈上,因为没有使用new来分配它。数组类具有int数据[100],运算符重载返回对数据中特定索引的引用
推荐
我的问题是int数据[100]是在堆栈上还是在堆上?我认为它不应该是堆栈,否则像上面那样的引用如何返回仍然有效
谢谢。
它在堆栈上,因为正如您所注意到的,
在堆栈上分配了一个
堆栈就像堆一样是内存;您可以返回对其中一部分的引用,就像在堆上分配内存一样。唯一的区别在于如何管理内存
唯一需要注意的是不要访问已释放的内存;对于堆栈,这发生在
a
范围的末尾,而堆分配的数据必须被显式删除
在您提到的问题中,对堆栈上声明的变量的引用是从函数返回的;在这种情况下,当函数退出时,变量被销毁,这就是代码出错的原因。然而操作系统堆栈 数据结构区别 smth,在您的例子中,您返回了对
数据
的一部分的引用,该数据的生存期与
数组
对象的生存期相匹配;因此,只要
a
没有被销毁,就可以安全地以这种方式访问它的数据。
它在堆栈上。为什么引用返回会成为一个问题?您可以毫无问题地创建和使用对堆栈上事物的引用
void foo(void)
{
int i;
<p>![操作系统堆栈 数据结构区别 smth_堆栈操作_数组结构与链表结构堆栈队列][4]
int& j = i; // reference to variable on the stack
j = 2;
}
</p>
您认为这里可能存在什么问题?
它将在堆栈上。如果您试图在“a”超出范围后使用该引用操作系统堆栈 数据结构区别 smth C++ 类私有数据,您将得到未定义的行为。希望它很快就会崩溃
我的问题是int数据[100]是在堆栈上还是在堆上?我认为它不应该是堆栈,否则像上面那样的引用如何返回仍然有效
它分配了自动存储持续时间,即堆栈操作系统堆栈 数据结构区别 smth,而不是堆。您没有动态分配任何内容,因此不会发生动态(堆)分配。这将是一件可怕的事情,而C++完全不为你不使用的东西付费。如果
数据
文章来源:http://duoduokou.com/cplusplus/25837163110341553085.html