使用new关键字在C ++中创建对象的区别与否

时间:2014-03-25 01:50:42

标签: c++ new-operator

我是C++的新手我只是想知道这些陈述之间的区别:

注意:Enemy是Ninja类的基类

Ninja n;
Enemy * enemy = &n;

Enemy * enemy = new Ninja;

我也想知道何时应该使用这些陈述,以防它们有差异。

3 个答案:

答案 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()方法,就必须销毁该实例。