何时使用“新”,何时不使用C ++?
可能重复:
我应该什么时候在C ++中使用新的关键字?
什么时候应该在C ++中使用“新”运算符? 我来自C#/ Java背景,实例化对象令我感到困惑。
如果我创建了一个名为“Point”的简单类,那么当我创建一个点时,我应该:
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
的使用决定了你的对象是堆栈还是堆栈,但只有在函数中声明的变量才是真的。
在下面的例子中,'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 ++对象实例化的一些很好的答案。
这个基本思想是,在堆上实例化的对象(使用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。 这允许通过指针的帮助从当前函数或过程的外部访问对象。
在C ++中查找指针和内存管理可能是有用的,因为这些是你在其他语言中不太可能遇到的事情。
链接地址: http://www.djcxy.com/p/78705.html