C++中A a; 与 A* a = new A(); 有什么不同?

Viewed 34

C++ 中的两种创建对象方式:

A a;

A& ap = new A();

这两种有什么区别?

1 Answers

A a;A* a = new A(); 是两种不同的对象定义方式,其区别如下:

  1. 内存分配方式不同:A a; 是在栈上分配内存,而 A* a = new A(); 是在堆上分配内存。

  2. 返回值类型不同:A a; 返回的是一个对象,而 A* a = new A(); 返回的是一个指向对象的指针。

  3. 构造函数调用方式不同:A a; 调用的是默认构造函数,而 A* a = new A(); 调用的是默认构造函数和 operator new 函数。

  4. 内存管理方式不同:A a; 在作用域结束时自动调用析构函数,释放分配在栈上的内存,而 A* a = new A(); 必须手动调用 delete 函数来释放分配在堆上的内存。

  5. 调用对象函数的方式不同, A a; 调用函数方式为 a.MethodName(), 而 A* a = new A(); 调用函数的方式为 a --> MethodName()

总的来说,使用 A a; 定义对象比使用 A* a = new A(); 更为常见,因为栈内存的分配和释放速度比堆内存要快,且不需要手动调用 delete 函数
但在某些情况下,例如需要在函数外部访问该对象,或者需要动态分配对象的大小时,使用 new 运算符来分配对象内存则更为适合。