风也温柔

计算机科学知识库

操作系统堆栈 数据结构区别 smth C++ 类私有数据

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

  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];
    &emsp;&emsp;![堆栈操作_数组结构与链表结构堆栈队列_操作系统堆栈 数据结构区别 smth][2]

       ...
    }

</p>
  (如果我错了,请纠正我)数组类型的变量位于堆栈上,因为没有使用new来分配它。数组类具有int数据[100],运算符重载返回对数据中特定索引的引用

  推荐

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

  谢谢。

  它在堆栈上,因为正如您所注意到的,

  操作系统堆栈 数据结构区别 smth_数组结构与链表结构堆栈队列_堆栈操作

  在堆栈上分配了一个

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

  唯一需要注意的是不要访问已释放的内存;对于堆栈,这发生在

  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