指针是否持有堆栈或堆中的动态变量?

3
我希望澄清一些我发现大部分来源都很令人困惑的内容。
例如,
int *a=new int;

“a”在栈或堆中,而“*a”呢?大多数资料都只提到了堆,我需要一个非常具体的答案。如果您能帮我解决这个问题,我将不胜感激。

3
堆上存 *a,栈上存 a - Gaurav Sehgal
仅适用于具有堆栈或堆的体系结构。 - Jerry Jeremiah
可能是重复问题:https://dev59.com/JG025IYBdhLWcg3wtofX 或 https://dev59.com/hHVD5IYBdhLWcg3wHn2d - Jerry Jeremiah
@JerryJeremiah 喜欢吗? - Gaurav Sehgal
你需要展示更多的代码来确定 a 的位置。它也可能是一个全局变量。 - MSalters
2个回答

8
a在堆栈中。当a的作用域结束时,a不能再使用。 *a在堆中。即使a的作用域结束,a指向的对象仍然存在,除非在此之前释放了内存。

如果全局的 new 已经被重载以在不同于堆的位置获取内存并构造对象,那该怎么办? - Fantastic Mr Fox

0
除了在堆栈或堆上的位置之外,您应该以C++的方式考虑它,即考虑其存储期。例如,全局new运算符可以被重载为执行任何操作。也许你得到的对象不在堆或栈上,而是在全局或某些特定设备内存中创建的。 a具有自动存储期。这意味着:

对象的存储空间在封闭代码块的开头分配,并在结尾处释放。

new int创建的对象具有动态存储期:

通过使用动态内存分配函数按请求分配和释放对象的存储空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接