何时使用"new"和何时不使用,在C++中?

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)

有人可以为我澄清何时使用新操作员以及何时不使用?

重复:

我什么时候应该在C++中使用new关键字?

有关:

关于C++中用于自定义对象的构造函数/析构函数和new/delete运算符

在C++中适当的堆栈和堆使用?

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)

(*先发制人的挑剔 - 是的,有扩展允许可变大小的堆栈分配).

  • +1好一个.只记得第一个可以写成Point p(0,0); 太.= ..语法可能会让他认为p在某种程度上是指定了某些东西的指针. (7认同)
  • +1记住你需要手动删除新的指针删除p1; (2认同)
  • @Andrew Grant如果必须使用新的,请使用`shared_ptr`或`unique_prt`。在c ++ 11 STL <memory>共享指针中引入的内容将自动删​​除。注意,由shared_ptr提供的数组默认deleter调用delete而不是delete [],因此使用lambda函数`std :: shared_ptr <int> p(new int [10],[](int * p){delete [] p; });`或`std :: shared_ptr <int> p(new int [10],std :: default_delete <int []>());`或使用unique_ptr提供的帮助程序,该帮助程序调用delete [] std :: unique_ptr <int,void(*)(int *)> p(new int [10],[](int * p){delete [] p;});` (2认同)

Ecl*_*pse 8

看一下这个问题这个问题,就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)