何时使用new-operator

When to use new-operator?

本文关键字:new-operator 何时使      更新时间:2023-10-16

何时使用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;
}

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

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

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

考虑到最近的c++ 11和即将发布的c++ 14标准,在使用带有垃圾收集的语言(如Java或c#)编程时,您应该主要使用new操作符。这对这些语言来说是很自然的。但是在现代c++中,您可以(而且通常应该)避免直接分配内存。我们现在有了一组漂亮的智能指针

当您希望从堆而不是堆栈中分配时,请使用new。或者提升一个抽象层次。当您需要在分配内存的函数(更合适的范围)可能(在线程的情况下)退出后保持分配的内存时,请使用new。

当您希望一个对象在删除之前一直存在时,应该使用new。如果不使用new,那么对象将在超出作用域时被销毁。

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

使用'new'来分配(和释放)对象要比就地分配要昂贵得多,所以它的使用应该限制在必要的地方。

int * p2 = new int;

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

int n1;
int * p1 = &n1;

在这两种情况下(p1和p2),都将int型的地址赋值给指针。在第二个在这种情况下,也可以通过名称:p1访问int类型。在第一种情况下,您只能通过指针进行访问。请记住,应该使用delete来释放new

分配的内存。
delete p2;

你需要读一些好书…

在这段代码中,您确实处理内存,但使用的是自动内存。编译器会为您找出在哪里存储每个变量。你有p1指向n1,但大多数工作是自动完成的。

int *p1;
int n1 = 5;
p1 = &n1;ou
但是在下一段代码中,你要求动态分配一个int
int *p2;
p2 = new int;
*p2 = 5;

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

delete p2;

这是最大的区别,当你开始使用new do delete它分配内存时,否则对象实例的解构将不会运行,因此不会清除你分配的内存。