98 c++ new-operator
可能重复:
我何时应该在C++中使用new关键字?
我什么时候应该在C++中使用"new"运算符?我来自C#/ Java背景,实例化对象让我感到困惑.
如果我创建了一个名为"Point"的简单类,当我创建一个点时,我应该:
Point p1 = Point(0,0);
Run Code Online (Sandbox Code Playgroud)
要么
Point* p1 = new Point(0, 0);
Run Code Online (Sandbox Code Playgroud)
有人可以为我澄清何时使用新操作员以及何时不使用?
重复:
有关:
And*_*ant 132
new当你希望一个物体保持存在直到delete它为止时,你应该使用它.如果你不使用new那么当对象超出范围时,它将被销毁.一些例子是:
void foo()
{
Point p = Point(0,0);
} // p is now destroyed.
for (...)
{
Point p = Point(0,0);
} // p is destroyed after each loop
Run Code Online (Sandbox Code Playgroud)
有些人会说使用new决定你的对象是在堆还是堆栈上,但这只适用于在函数中声明的变量.
在下面的示例中,'p'的位置将是分配其包含对象Foo的位置.我更喜欢称之为'就地'分配.
class Foo
{
Point p;
}; // p will be automatically destroyed when foo is.
Run Code Online (Sandbox Code Playgroud)
使用分配(和释放)对象new比在原地分配对象要昂贵得多,因此必须将其使用限制在必要的范围内.
分配via的第二个例子new是数组.您不能*在运行时更改就地或堆栈数组的大小,因此您需要一个未确定大小的数组,它必须通过new分配.
例如
void foo(int size)
{
Point* pointArray = new Point[size];
...
delete [] pointArray;
}
Run Code Online (Sandbox Code Playgroud)
(*先发制人的挑剔 - 是的,有扩展允许可变大小的堆栈分配).
看一下这个问题和这个问题,就C++对象实例化提供一些好的答案.
这个基本思想是在堆上实例化的对象(使用new)需要手动清理,在堆栈上实例化的对象(没有新的)在超出范围时会自动清理.
void SomeFunc()
{
Point p1 = Point(0,0);
} // p1 is automatically freed
void SomeFunc2()
{
Point *p1 = new Point(0,0);
delete p1; // p1 is leaked unless it gets deleted
}
Run Code Online (Sandbox Code Playgroud)