我何时应该在C ++中使用“new”运算符?我来自C#/ Java背景,实例化对象让我感到困惑。
如果我创建了一个名为“Point”的简单类,那么当我创建一个点时,我应该:
Point p1 = Point(0,0);
或
Point* p1 = new Point(0, 0);
有人可以向我澄清何时使用新操作员以及何时不使用?
重复:
When should I use the new keyword in C++?
相关:
About constructors/destructors and new/delete operators in C++ for custom objects
答案 0 :(得分:131)
当您希望对象保持存在时,您应该使用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
分配(和释放)对象远比在原地分配对象要昂贵得多,因此应将其使用限制在必要的范围内。
何时通过new
分配的第二个示例是数组。您不能*在运行时更改就地或堆栈数组的大小,因此您需要一个未确定大小的数组,它必须通过new分配。
E.g。
void foo(int size)
{
Point* pointArray = new Point[size];
...
delete [] pointArray;
}
(*先发制人的挑剔 - 是的,有扩展允许可变大小的堆栈分配。)
答案 1 :(得分:8)
查看this question和this question,了解有关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
}
答案 2 :(得分:4)
当您希望在堆而不是堆栈上创建对象时,应该使用new。这允许通过指针帮助从当前函数或过程外部访问对象。
在C ++中查找指针和内存管理可能是有用的,因为这些是你不太可能在其他语言中遇到的事情。
答案 3 :(得分:1)
New总是用来分配动态内存,然后必须释放它。
通过执行第一个选项,当范围丢失时,将自动释放该内存。
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;