123

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

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

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

Point p1 = Point(0,0);

或者

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

有人可以为我澄清什么时候使用 new 运算符,什么时候不使用?

副本:

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

有关的:

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

在 C++ 中正确使用堆栈和堆?

4

4 回答 4

168

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

有人会说,使用new决定了你的对象是在堆上还是在栈上,但这仅适用于在函数中声明的变量。

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

class Foo
{

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

使用 分配(和释放)对象new比就地分配对象要昂贵得多,因此应将其使用限制在必要的地方。

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

例如

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

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

于 2009-03-24T22:56:35.657 回答
10

看看这个问题这个问题,以获得关于 C++ 对象实例化的一些好的答案。

这个基本思想是在堆上实例化的对象(使用new)需要手动清理,在堆栈上实例化的对象(没有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
}
于 2009-03-24T22:57:27.730 回答
4

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

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

于 2009-03-24T22:58:25.060 回答
2

新总是用于分配动态内存,然后必须释放。

通过执行第一个选项,当范围丢失时,该内存将自动释放。

Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function.

Point* p2 = new Point(0, 0); //This must be freed manually. with...
delete p2;
于 2009-03-24T22:58:06.730 回答