When to use “new” and when not to, in C++?
Possible Duplicate:
When should I use the new keyword in C++?
我什么时候应该在C ++中使用"new"运算符? 我来自C#/ Java背景,实例化对象让我感到困惑。
如果我创建了一个名为"Point"的简单类,当我创建一个点时,我应该:
1 | Point p1 = Point(0,0); |
要么
1 | Point* p1 = new Point(0, 0); |
有人可以为我澄清何时使用新操作员以及何时不使用?
重复:
我什么时候应该在C ++中使用new关键字?
有关:
关于C ++中用于自定义对象的构造函数/析构函数和new / delete运算符
在C ++中适当的堆栈和堆使用?
当您希望对象保持存在时,您应该使用
1 2 3 4 5 6 7 8 9 | void foo() { Point p = Point(0,0); } // p is now destroyed. for (...) { Point p = Point(0,0); } // p is destroyed after each loop |
有些人会说使用
在下面的示例中,'p'的位置将是分配其包含对象Foo的位置。我更喜欢称之为'就地'分配。
1 2 3 4 5 | class Foo { Point p; }; // p will be automatically destroyed when foo is. |
使用
何时分配via
例如。
1 2 3 4 5 6 | void foo(int size) { Point* pointArray = new Point[size]; ... delete [] pointArray; } |
(*先发制人的挑剔 - 是的,有扩展允许可变大小的堆栈分配)。
看一下这个问题和这个问题,就C ++对象实例化提供一些好的答案。
这个基本思想是在堆上实例化的对象(使用new)需要手动清理,在堆栈上实例化的对象(没有新的)在超出范围时会自动清理。
1 2 3 4 5 6 7 8 9 10 | 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 ++中查找指针和内存管理,因为这些是您不太可能在其他语言中遇到的事情。
New总是用于分配动态内存,然后必须释放它。
通过执行第一个选项,当范围丢失时,将自动释放该内存。
1 2 3 4 | 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; |