这两种对象实例化方法有什么区别?

smw*_*dia 6 c++

假设我有一个名为A的类:

Class A
{
...
}
Run Code Online (Sandbox Code Playgroud)

以下两种实现对象的方法之间的区别是什么:

void main(void)
{
    A a;  // 1
    A *pa=new A();  // 2
}
Run Code Online (Sandbox Code Playgroud)

正如我目前的理解(尚未确定):

  • 方法1在main()方法的堆栈帧上分配对象a,因此该对象无法删除,因为该删除没有意义(不知道为什么,有人可以解释一下吗?).

  • 方法2在进程的堆上分配对象a,并在main()方法的堆栈帧上分配A*vairable pa,因此可以删除对象,并且可以在删除后将pa指定为null.

我对吗?如果我的理解是正确的,有人可以告诉我为什么我不能在方法1中从堆栈中删除一个对象?

非常感谢...

CB *_*ley 6

对象a具有自动存储持续时间,因此将在定义它的范围的末尾自动删除它.尝试手动删除它没有意义.只有具有动态存储持续时间的对象(例如*pa已使用分配的对象)才需要手动删除new.


fas*_*ava 1

方法 1 声明一个变量并创建一个对象。在方法 2 中,您创建了一个实例并指向它的指针。

编辑:在方法 1 中,对象将超出范围并被自动删除。在方法2中,指针将被自动删除,但不会删除它所指向的内容。那将是你的工作。