差异:A * a =新A();与A B; A * c =& b;

时间:2014-05-22 12:17:25

标签: c++ pointers

在采访中被问到。

  1. A* a=new A();
  2. A b; A *c=&b;
  3. 1和2有什么区别?

    我在第二个语句中说过,对象是在堆栈和堆栈中创建的。我的朋友说对象总是在堆上创建。

    什么是正确的答案?

2 个答案:

答案 0 :(得分:6)

你是对的 - 第二个代码块 - 假设它出现在一个函数 - 将有b和{{1在堆栈上,虽然当然取决于c的类型,它可能有内部指针指向堆分配的内存(Astd::string等等,如果他们& #39;不为空且比任何内部缓冲区都大。

那就是说,std::vector本身也会在第一个区块的堆栈中 - 它只是它指向的对象 - a,它必然在堆。

换句话说,*aa实际上是等价的:基于堆栈的值,但前者指向堆分配的c,而第二个指向另一个堆栈分配{ {1}} ...

答案 1 :(得分:6)

"堆栈"和"堆"是实施条款。选择#1动态分配A,选择#2自动执行相同的操作。可能程序最终会使用诸如堆 * 之类的东西进行动态存储,而堆栈则是自动存储,但这并不能保证。

但是接受该术语的松散使用,并且总是在堆上创建"对象当然是不正确的。"也许你的朋友在想Java?

* 不在数据结构意义上的单词