gpt4 book ai didi

c++ - 直接声明变量和使用关键字new有什么区别?

转载 作者:行者123 更新时间:2023-11-30 01:53:19 24 4
gpt4 key购买 nike

当您直接声明该变量占用一大块数据时,但是当您使用关键字 new 声明一个变量时,它会使用“自由存储”中的内存初始化一个指针,该内存基本上是未使用的内存。这些有什么区别?

int *p_int = new int;
int *p_int;

最佳答案

有很多区别。

动态分配

int *x = new int;

这就是所谓的“动态分配”。

new int 在堆上分配内存来存放一个int,并返回这 block 内存的地址(指针)。因此,在这条语句之后,x 将是一个内存地址,例如 0x200fd2a11 或其他任何内容。它指向的内存可以作为一个整数来使用。这是同一个例子,有点扩展:

int *x;// declare a pointer to an integer. at this stage, x is uninitialized and does not point to anything.
x = new int;// set x to point to a newly allocated int.
*x = 4;// now we are using the integer for the first time, setting it to 4.
delete x;// you must delete dynamically allocated memory, or you'll have a memory leak.

请注意,您在这里处理两个不同的值:指针和整数。

另请注意,您必须在使用完指针后删除该指针,以释放该内存。

自动分配

好的,让我们继续并描述它与以下内容的不同之处:

int x;
x = 4;

这里,x 是一个“auto 变量”。最大的根本区别是它的存储是在栈上分配的。这是一种动态分配和自动分配之间的差异列表:

  • 自动变量在离开作用域时将被自动清除。这意味着您无需费心使用 delete,但这意味着您无法对其生命周期进行精细控制。
  • 堆栈内存是固定大小的。因此,如果您尝试执行 int x[100000000];,您的应用可能会崩溃。
  • 自动变量不处理指针间接寻址。您可以直接访问该值,而不必取消引用指针(如 *x = 4; 中的星号)。你可以只做 x = 4;
  • 自动变量的大小必须在编译时已知,因为代码是如何生成来处理堆栈的。因此,您不能执行 int x[y]; 之类的操作,因为在编译时不知道要分配的数量。

我什么时候使用动态还是自动?

Auto 更简单,至少和 dynamic 一样快,所以默认为 auto。除非:

  1. 编译时不知道大小
  2. 或者,大小是“大”。比如,大于几百个字节,我通常会移动到堆中。它有助于调试并且更安全。
  3. 或者,生命周期不受代码范围的限制。例如,如果您需要在函数中分配一个对象,并在该函数返回后继续生存。

实践

但最后,在现代 C++ 中,我们尽量避免使用指针。必须手动删除 内存很烦人且容易出错。无论您多么勤奋,这都是内存泄漏的秘诀。对于动态数组,使用 std::vector。为了分配需要被许多东西共享的对象,使用智能指针对象(unique_ptrshared_ptrweak_ptr)。几乎总有比使用原始指针更安全的选择。

关于c++ - 直接声明变量和使用关键字new有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23225623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com