在采访中被问到。
A* a=new A();
A b; A *c=&b;
1和2有什么区别?
我在第二个语句中说过,对象是在堆栈和堆栈中创建的。我的朋友说对象总是在堆上创建。
什么是正确的答案?
答案 0 :(得分:6)
你是对的 - 第二个代码块 - 假设它出现在一个函数 - 将有b
和{{1在堆栈上,虽然当然取决于c
的类型,它可能有内部指针指向堆分配的内存(A
,std::string
等等,如果他们& #39;不为空且比任何内部缓冲区都大。
那就是说,std::vector
本身也会在第一个区块的堆栈中 - 它只是它指向的对象 - a
,它必然在堆。
换句话说,*a
和a
实际上是等价的:基于堆栈的值,但前者指向堆分配的c
,而第二个指向另一个堆栈分配{ {1}} ...
答案 1 :(得分:6)
"堆栈"和"堆"是实施条款。选择#1动态分配A
,选择#2自动执行相同的操作。可能程序最终会使用诸如堆 * 之类的东西进行动态存储,而堆栈则是自动存储,但这并不能保证。
但是接受该术语的松散使用,并且总是在堆上创建"对象当然是不正确的。"也许你的朋友在想Java?
* 不在数据结构意义上的单词