什么时候使用new-operator?

时间:2013-05-29 22:52:12

标签: c++ pointers new-operator

我应该何时使用new-operator
在我的例子中,我使用两种不同的方法得到相同的结果:

#include <iostream>
int main() {
    int *p1;
    int n1 = 5;
    p1 = &n1;

    int *p2;
    p2 = new int;
    *p2 = 5;

    std::cout << *p1 << std::endl;
    std::cout << *p2 << std::endl;
    return 0;
}

6 个答案:

答案 0 :(得分:1)

使用动态分配的内存的目的是以下一个(或多个)

  • 运行时控制对象的生命周期。例如。该对象由new手动创建,并由delete根据用户的意愿手动销毁。
  • 对象类型的运行时控制。例如。您可以在运行时确定实际类型的多态对象。
  • 运行时控制对象的数量。例如。您可以在运行时决定列表中的数组大小或元素数。
  • 当物体太大而无法合理地放入任何其他类型的记忆中时。例如。一个大的输入输出缓冲区,太大而无法在堆栈上分配

在您的具体示例中,这些原因都不适用,这意味着在那里使用动态内存毫无意义。

答案 1 :(得分:1)

考虑到最近的C ++ 11和即将推出的C ++ 14标准,你应该在使用垃圾收集的语言编程时使用new运算符,例如Java或C#。这些语言很自然。但是在现代C ++中,您可以(并且通常应该)避免直接分配内存。我们现在有一套很好的智能指针。

答案 2 :(得分:0)

如果要从堆中分配,而不是堆栈,请使用new。或者提升一个抽象层次。在您需要分配的内存后,使用new,在分配了它的函数(更合适的范围)之后(在线程的情况下)已经退出。

答案 3 :(得分:0)

当您希望对象保持存在直到您删除它时,您应该使用new。如果不使用new,那么当对象超出范围时,该对象将被销毁。

有些人会说使用new决定你的对象是在堆还是堆栈上,但这只适用于在函数中声明的变量。

使用'new'分配(和释放)对象比在原地分配对象要昂贵得多,因此必须将其限制在必要的范围内。

答案 4 :(得分:0)

在这段代码中,你会处理内存,但需要自动内存。编译器会为您选择存储每个变量的位置。您p1指向n1,但大部分工作都是自动完成的。

int *p1;
int n1 = 5;
p1 = &n1;ou

但是在下一段代码中,您请求动态分配int

int *p2;
p2 = new int;
*p2 = 5;

这里你创建了一个动态存储的新整数,因此你也应该删除它,否则你已经创建了第一个内存泄漏。如果您动态分配,则必须注意在使用后将其删除。

delete p2;

当你开始使用new do delete分配内存时,这是最大的差异,否则对象实例的解构将无法运行,因此无法清除已分配的内存。

答案 5 :(得分:0)

int * p2 = new int;

新的int部分告诉程序你想要一些适合持有的新存储 运算符使用该类型来确定需要多少字节。 然后它找到内存并返回地址。接下来,将地址分配给p2,即 声明为指向int的类型。现在p2是地址,* p2是存储的值 那里。将此与将变量的地址分配给指针进行比较:

int n1;
int * p1 = &n1;

在这两种情况下(p1和p2),都将int的地址分配给指针。在第二 case,您还可以通过名称访问int:p1。在第一种情况下,您唯一的访问是通过指针。 请记住,您应该使用delete来释放由新

分配的内存
delete p2;

你需要阅读一些好书...... 我认为“C ++ Primer plus”对你来说是一个很好的