何时使用“新”,何时不使用C ++?

可能重复:
我应该什么时候在C ++中使用新的关键字?

什么时候应该在C ++中使用“新”运算符? 我来自C#/ Java背景,实例化对象令我感到困惑。

如果我创建了一个名为“Point”的简单类,那么当我创建一个点时,我应该:

Point p1 = Point(0,0);

要么

Point* p1 = new Point(0, 0);

有人能为我澄清什么时候使用新的操作员,什么时候不需要?

重复:

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

有关:

关于C ++中用于自定义对象的构造函数/析构函数和新/删除操作符

C ++中正确的堆栈和堆使用情况?


当你希望一个对象保持存在直到你delete它时,你应该使用new 。 如果你不使用new那么当它超出范围时,对象将被销毁。 这方面的一些例子是:

void foo()
{
  Point p = Point(0,0);
} // p is now destroyed.

for (...)
{
  Point p = Point(0,0);
} // p is destroyed after each loop

有些人会说new的使用决定了你的对象是堆栈还是堆栈,但只有在函数中声明的变量才是真的。

在下面的例子中,'p'的位置将是其包含对象Foo的分配位置。 我更愿意称之为“就地”分配。

class Foo
{

  Point p;
}; // p will be automatically destroyed when foo is.

使用new分配(和释放)对象比分配到位要便宜得多,因此它的使用应限制在必要的地方。

何时通过new分配的第二个例子是数组。 在运行时,您不能*更改就地或堆栈数组的大小,因此,如果您需要一个未定大小的数组,它必须通过新分配。

例如

void foo(int size)
{
   Point* pointArray = new Point[size];
   ...
   delete [] pointArray;
}

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


看看这个问题和这个问题,以获得关于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
}

当你想在堆上创建一个对象而不是堆栈时,你应该使用new。 这允许通过指针的帮助从当前函数或过程的外部访问对象。

在C ++中查找指针和内存管理可能是有用的,因为这些是你在其他语言中不太可能遇到的事情。

链接地址: http://www.djcxy.com/p/78705.html

上一篇: When to use "new" and when not to, in C++?

下一篇: Where are static class variables stored in memory?