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

Differences: A* a=new A(); vs. A b; A *c=&b;

本文关键字:差异      更新时间:2023-10-16

采访中问道。

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

1和2的区别是什么?

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

正确答案是什么?

你是对的-第二块代码- 假设它出现在函数中-将在堆栈上有bc,尽管当然取决于A的类型,它可能有指向堆分配内存的内部指针(std::string, std::vector等都是这样的例子,如果它们不是空的并且大于任何内部缓冲区)。

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

换句话说,ac实际上是等价的:基于堆栈的值,但是前者指向堆分配的A,而后者指向另一个堆栈分配的A ....

"Stack"answers"heap"是实现术语。选择#1动态地分配A,选择#2自动地做同样的事情。可能程序最终会使用堆*之类的东西来进行动态存储,使用堆栈来进行自动存储,但这并不能保证。

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

*不是数据结构意义上的