什么时候应该在 C++ 中使用“new”运算符?我来自 C#/Java 背景,实例化对象让我感到困惑。
如果我创建了一个名为“Point”的简单类,那么当我创建一个点时,我应该:
Point p1 = Point(0,0);
或者
Point* p1 = new Point(0, 0);
有人可以为我澄清什么时候使用 new 运算符,什么时候不使用?
副本:
有关的:
什么时候应该在 C++ 中使用“new”运算符?我来自 C#/Java 背景,实例化对象让我感到困惑。
如果我创建了一个名为“Point”的简单类,那么当我创建一个点时,我应该:
Point p1 = Point(0,0);
或者
Point* p1 = new Point(0, 0);
有人可以为我澄清什么时候使用 new 运算符,什么时候不使用?
副本:
有关的:
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;
}
(*先发制人的挑剔 - 是的,有一些扩展允许可变大小的堆栈分配)。
当您希望在堆而不是堆栈上创建对象时,您应该使用 new。这允许通过指针的帮助从当前函数或过程之外访问对象。
在 C++ 中查找指针和内存管理可能对您有用,因为这些是您不太可能在其他语言中遇到的事情。
新总是用于分配动态内存,然后必须释放。
通过执行第一个选项,当范围丢失时,该内存将自动释放。
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;