gpt4 book ai didi

C++释放带有子数组的数组的内存分配

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:30 25 4
gpt4 key购买 nike

理论上,如果我只删除 arrays 就足够了吗?和 results但不要删除 sub_array arrays 内部在以下代码片段中,return 0; 之前还是我必须先删除所有 sub_array在我可以安全删除之前 arraysresults .

int main() {

int subarrays, queries;

cin >> subarrays >> queries;

int** arrays = new int* [subarrays]();

int* results = new int[queries];

for (int i = 0; i < subarrays; i++) {

int length;
cin >> length;

int* sub_array = new int[length];

for (int j = 0; j < length; j++) {

int element;
cin >> element;

sub_array[j] = element;
}

arrays[i] = sub_array;
}

for (int i = 0; i < queries; i++) {

int query_from, arr_index;
cin >> query_from >> arr_index;

results[i] = arrays[query_from][arr_index];
}

for (int i = 0; i < queries; i++) {

cout << results[i] << endl;
}

return 0;
}

最佳答案

您不应该删除 sub_array,因为它指向的缓冲区存储在 arrays[n] 中。因为你可以删除 sub_array 的唯一方法是在它被声明的 block 范围内(这是 for 循环),如果你确实删除它那么 arrays[n] 将是悬挂指针(指向已释放或无效内存块的指针)和悬挂指针是邪恶的

对于 arrayssub_array 你应该做的是当它们不再需要时,你首先遍历 arrays 的所有元素,删除它们中的每一个,在此之后,删除 arrays 本身。像这样的东西:

// when you are done with them
for(auto i = 0; i < subarrays; i++)
{
delete[] arrays[i];
}

delete[] arrays;

作为旁注,您应该考虑使用 smart pointers在此代码中。

关于C++释放带有子数组的数组的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57566220/

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