猿问

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

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


如果我创建了一个名为“ Point”的简单类,则在创建点时应该:


Point p1 = Point(0,0);

要么


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

有人可以为我澄清何时使用新运算符,什么时候不使用?


茅侃侃
浏览 469回答 4
4回答

翻阅古今

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;}(*先发制人的挑剔-是的,有些扩展允许大小可变的堆栈分配)。

守候你守候我

看一下这个问题和这个问题,以获取有关C ++对象实例化的一些好答案。这个基本思想是,需要手动清理在堆上实例化的对象(使用new),而超出范围时,将自动清理在堆栈上实例化的对象(没有new)。void SomeFunc(){    Point p1 = Point(0,0);} // p1 is automatically freedvoid SomeFunc2(){    Point *p1 = new Point(0,0);    delete p1; // p1 is leaked unless it gets deleted}

肥皂起泡泡

如果要在堆而不是堆栈上创建对象,则应使用new。这允许通过指针从当前函数或过程之外访问对象。在C ++中查找指针和内存管理可能对您很有用,因为您不太可能在其他语言中遇到这些问题。

ITMISS

总是使用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;
随时随地看视频慕课网APP
我要回答