为了账号安全,请及时绑定邮箱和手机立即绑定

什么时候在C ++中使用“新”而什么时候不使用?

什么时候在C ++中使用“新”而什么时候不使用?

C++
茅侃侃 2019-10-06 11:01:42
什么时候应该在C ++中使用“ new”运算符?我来自C#/ Java背景,实例化对象使我感到困惑。如果我创建了一个名为“ Point”的简单类,则在创建点时应该:Point p1 = Point(0,0);要么Point* p1 = new Point(0, 0);有人可以为我澄清何时使用新运算符,什么时候不使用?
查看完整描述

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;

}

(*先发制人的挑剔-是的,有些扩展允许大小可变的堆栈分配)。


查看完整回答
反对 回复 2019-10-06
?
守候你守候我

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

}


查看完整回答
反对 回复 2019-10-06
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如果要在堆而不是堆栈上创建对象,则应使用new。这允许通过指针从当前函数或过程之外访问对象。

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


查看完整回答
反对 回复 2019-10-06
?
ITMISS

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;


查看完整回答
反对 回复 2019-10-06
  • 4 回答
  • 0 关注
  • 468 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信