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

Ian*_*ath 3 c++ pointers

在采访中被问到.

  1. A* a=new A();
  2. A b; A *c=&b;

1和2有什么区别?

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

什么是正确的答案?

Ton*_*roy 6

你是一种权利-代码的第二块- 假设它出现在函数内部 -将拥有bc在堆栈上,当然这取决于类型的,虽然A它可能有内部指针堆分配的内存(std::string,std::vector等被例如,如果它们不是空的并且比任何内部缓冲区都大.

也就是说,a它本身也会在第一个块的堆栈中 - 它只是它指向的对象 - 它*a必然在堆上.

换句话说,a并且c实际上等效:基于堆栈的值,但前者是指在堆分配A和第二另一个堆栈分配A....


dlf*_*dlf 6

"堆栈"和"堆"是实现术语.选择#1 A动态分配,选择#2自动完成相同的操作.可能程序最终会使用像堆*这样的动态存储和自动堆栈,但这并不能保证.

但是接受这个术语的松散使用,"对象总是在堆上创建"肯定是不正确的.也许你的朋友在想Java?

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