使用“ new”的c ++动态内存分配

Jac*_*b.B 4 c++ memory-management

我是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];

}
Run Code Online (Sandbox Code Playgroud)
  1. 当扩展数组容量的唯一方法是将其复制到new更大的数组中时,我并不真正理解为什么将其称为动态的。

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

Mar*_*ila 5

当您在编译时知道数组的大小时,可以像这样声明它并将其存在于堆栈中:

int arr[42];
Run Code Online (Sandbox Code Playgroud)

但是,如果您在编译时(仅在运行时)不知道大小,则不能说:

int len = get_len();
int arr[len];
Run Code Online (Sandbox Code Playgroud)

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

int len = get_len();
int* arr = new int[len];
Run Code Online (Sandbox Code Playgroud)

当您不再需要该内存时,您需要做一个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
Run Code Online (Sandbox Code Playgroud)