4 回答
TA贡献1780条经验 获得超5个赞
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;
}
(*先发制人的挑剔-是的,有些扩展允许大小可变的堆栈分配)。
TA贡献1802条经验 获得超10个赞
看一下这个问题和这个问题,以获取有关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
}
TA贡献1829条经验 获得超6个赞
如果要在堆而不是堆栈上创建对象,则应使用new。这允许通过指针从当前函数或过程之外访问对象。
在C ++中查找指针和内存管理可能对您很有用,因为您不太可能在其他语言中遇到这些问题。
TA贡献1871条经验 获得超8个赞
总是使用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;
- 4 回答
- 0 关注
- 468 浏览
添加回答
举报