我是C++
的新手我只是想知道这些陈述之间的区别:
注意:Enemy是Ninja类的基类
Ninja n;
Enemy * enemy = &n;
和
Enemy * enemy = new Ninja;
我也想知道何时应该使用这些陈述,以防它们有差异。
答案 0 :(得分:1)
Ninja n;
----> n是堆栈。你不需要手动破坏它。
new Ninja;
----> n在堆中。如果不需要,您应该使用delete enemy;
将其删除
注意:使用父类的指针删除子类的对象时。您最好在两个类中定义虚拟析构函数。
答案 1 :(得分:1)
执行此操作时:
Ninja n;
你将Ninja分配到堆栈上这个
Enemy * enemy = &n;
获取指向该位置的指针。离开当前函数后,堆栈中的内存将被重用,您的Ninja *将悬空:如果您尝试访问它(取消引用),您的程序将崩溃或更糟。
执行此操作时:
Enemy * enemy = new Ninja;
你在堆上分配一个新的Ninja对象。你可以继续使用你的Ninja实例,直到你用
释放内存delete enemy;
查看this question的答案,以更好地了解堆栈与堆分配。
答案 2 :(得分:0)
new()将在内存中动态创建一个实例(如C中的malloc()) 第一个声明为实例提供了静态分配的内存(如果声明在函数内部,则在teh堆栈中分配)。
使用new(),一旦不再需要通过delete()方法,就必须销毁该实例。