什么时候使用“新”,什么时候不使用C ++?

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

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

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

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的使用决定了你的对象是堆栈还是堆栈,但只有在函数中声明的variables才是真的。

在下面的例子中,'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 ++对象实例化一些很好的答案。

这个基本的想法是,在堆上实例化的对象(使用新的)需要手动清理,在堆栈上实例化的对象(没有新的)在超出范围时自动清理。

 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 } 

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

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

新的总是用来分配dynamic内存,然后必须释放。

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

 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;