为什么最后 newarr的堆释放了void add(people** arr, const int nov) { people* p = new people(); cout << "enter name" << endl; cin >> p->name; cout << "enter work" << endl; cin >> p->work; cout << "enter handlework" << endl; cin >> p->handlework; p->nov = nov; people** newarr = new people * [nov]; newarr[nov - 1] = p; for (int i = 0; i < nov - 1; i++) { newarr[i] = arr[i]; } //delete[]arr; *arr = *newarr; }
时间: 2024-04-17 17:25:15 浏览: 12
最后释放`newarr`的堆是因为在函数中我们使用了`new`关键字来分配了内存空间。当我们不再需要这个内存空间时,我们需要使用`delete`关键字来释放它,以避免内存泄漏。
在这段代码中,`newarr`是一个指向指针数组的指针。我们首先使用`new`关键字为`newarr`分配了一个长度为`nov`的指针数组。然后,我们将原始数组`arr`的元素复制到`newarr`中,并将新的指针数组赋值给原始数组`arr`。最后,我们没有释放`newarr`指向的内存空间。
为了正确释放内存,我们应该在函数的末尾添加以下代码:
```cpp
delete[] newarr;
```
这将释放`newarr`指向的指针数组所占用的内存空间。
相关问题
为什么void add(people** arr, const int nov) { people* p = new people(); cout << "enter name" << endl; cin >> p->name; cout << "enter work" << endl; cin >> p->work; cout << "enter handlework" << endl; cin >> p->handlework; p->nov = nov; people** newarr = new people * [nov]; newarr[nov - 1] = p; for (int i = 0; i < nov - 1; i++) { newarr[i] = arr[i]; } //delete[]arr; arr = newarr; }取不到newarr的值
在这段代码中,`void add(people** arr, const int nov)`函数中的`arr`参数是一个指向指针数组的指针。当我们在函数内部对`arr`进行修改时,实际上只是修改了指针本身的值,并不会修改指针指向的内存空间。
在这段代码中,`arr = newarr;`语句只是将`arr`指针指向了`newarr`指针数组的内存空间,并没有修改原始指针数组的内容。因此,在函数外部访问`arr`时,无法获取到`newarr`的值。
如果你想要修改原始指针数组的内容,你需要将`arr`声明为指向指针数组的引用,即`people**& arr`。这样,在函数内部修改`arr`时,会直接修改原始指针数组的内容。
修改后的代码如下:
```cpp
void add(people**& arr, const int nov) {
people* p = new people();
cout << "enter name" << endl;
cin >> p->name;
cout << "enter work" << endl;
cin >> p->work;
cout << "enter handlework" << endl;
cin >> p->handlework;
p->nov = nov;
people** newarr = new people * [nov];
newarr[nov - 1] = p;
for (int i = 0; i < nov - 1; i++) {
newarr[i] = arr[i];
}
delete[] arr;
arr = newarr;
}
```
这样,当你调用`add`函数并传入指针数组的引用时,`arr`的修改将会影响到原始指针数组。
newarr = [([0] * width) for n in range(high)]
这是一个创建二维数组的常见方法,它将创建一个高度为"high",宽度为"width"的二维数组,数组中的每个元素都是0。其中"range(high)"将创建一个从0到(high-1)的整数列表,每个整数对应着数组中的一行。"([0] * width)"将创建一个宽度为"width"的列表,其中每个元素都是0,这个列表将作为二维数组中的一行。整个表达式使用列表推导式语法,可以简单地理解为"对于每个n在range(high)中,创建一个宽度为width的列表,将这些列表组成一个高度为high的二维数组"。