在堆栈或堆上

在以下代码中:

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];
   ...
}

(如果我错了,纠正我)Array的变量a在堆栈中,因为没有使用new来分配它。 Array类具有int数据[100],并且运算符重载返回对数据中特定索引的引用。

引用问题。

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

谢谢。


它在栈上,因为你已经注意到a被分配在堆栈上。

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

唯一需要注意的是不要访问已经释放的内存; 在堆叠的情况下,这发生在的末端a的范围,而堆分配数据必须被明确地删除。

在你引用的问题中,从函数返回对栈中声明的变量的引用; 在这种情况下,该变量在函数退出时被销毁,这就是代码错误的原因。 但是,对于您的情况,您将返回一部分data的参考,这些data的生命周期与Array对象的生命周期相匹配; 只要a没有被销毁,就可以以这种方式访问​​它的数据。


它在堆栈上。 为什么参考回报会成为问题? 您可以在堆栈中创建并使用对事物的引用,而不会出现问题。

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

你认为可能存在什么问题?


它将在堆栈中。 如果在“a”超出范围之后尝试使用该引用,则会出现未定义的行为。 希望它很快就会崩溃。

链接地址: http://www.djcxy.com/p/82799.html

上一篇: on stack or heap

下一篇: About C/C++ stack allocation