在堆栈或堆上
在以下代码中:
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