gpt4 book ai didi

使用 "new"的 C++ 动态内存分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:18 24 4
gpt4 key购买 nike

我是 C++ 的新手,正在尝试自学(我有 Java 背景)。

有动态内存分配的概念,我可以使用 new 分配给一个数组(例如)。

在 C(以及 C++)中,我有 mallocrealloc 正在执行此操作。在 C++ 中,出于某种我无法理解的原因,他们添加了 new

我已经阅读了很多有关进入堆栈的普通数组与进入堆的动态分配数组之间的区别的文章。

所以我的理解是,通过使用 new 我在堆中分配空间,当完成一个函数时不会自动删除,但会保留在原处直到我最后,手动释放它。

我找不到在普通内存上使用动态内存分配的实际例子。

  1. 据说我在使用普通数组时无法通过运行时分配内存。好吧,可能我没有理解正确,因为当我尝试创建一个普通数组(没有 new)时,其容量由用户输入(如 arr[input]),它工作正常。

我的意思是:

int whatever;
cin>>whatever;

int arr2[whatever];

for (int i = 0; i < whatever; i++) {
arr2[i]=whatever;
cout<<arr2[i];

}
  1. 当扩展数组容量的唯一方法是将其复制到更大的 数组时,我真的不明白为什么它被称为动态。

我知道 Vector 类(我还没有学过)更好用。但是,我仍然不能就此离开知识鸿沟,我必须理解为什么它被称为动态以及为什么我应该使用它而不是普通数组。当我无法真正扩展内存而只能将其复制到新数组时,为什么还要手动释放内存?

最佳答案

当你在编译时知道数组的大小时,你可以这样声明它,它会存在于堆栈中:

int arr[42];

但是如果你在编译时不知道大小,只在运行时知道,那么你不能说:

int len = get_len();
int arr[len];

在这种情况下,您必须在运行时分配数组。在这种情况下,数组将存在于堆上。

int len = get_len();
int* arr = new int[len];

当您不再需要该内存时,您需要执行 delete [] arr

std::vector 是一个可变大小的容器,允许您在运行时分配和重新分配内存,而不必担心显式分配和释放它。

int len = get_len();
std::vector<int> v(len); // v has len elements
v.resize(len + 10); // add 10 more elements to the vector

关于使用 "new"的 C++ 动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088801/

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