在 C + + 中,什么时候使用“ new”,什么时候不使用?

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

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

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

Point p1 = Point(0,0);

或者

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

谁能告诉我什么时候使用新的接线员,什么时候不用?

复本:

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

相关阅读:

About constructors/destructors and new/delete operators in C++ for custom objects

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

141119 次浏览

你应该使用 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.

Allocating (and freeing) objects with the use of new is far more expensive than if they are allocated in-place so its use should be restricted to where necessary.

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

例如。

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

(* 先发制人的吹毛求疵——是的,有一些扩展允许可变大小的堆栈分配)。

看看 这个问题这个问题,它们对 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
}

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;

You should use new when you want an object to be created on the heap instead of the stack. This allows an object to be accessed from outside the current function or procedure, through the aid of pointers.

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