从理论上讲,如果仅删除以下代码片段中的内容arrays,results而又不删除它的sub_array内部内容,arrays就可以了,return 0;或者必须首先删除所有内容,sub_array然后才能安全地删除arrays和results。
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;
}
Run Code Online (Sandbox Code Playgroud)
您不应删除,sub_array因为它指向的缓冲区存储在中arrays[n]。因为唯一可以删除的方法sub_array是在声明的块范围内(这是for循环),所以如果删除它,arrays[n]则将是dangling pointer(指向已释放或无效内存块的指针),并且悬空指针是邪恶的。
你应该做的关于arrays和sub_array是不再被需要的时候,你第一次迭代通过的所有元素arrays,删除它们,并在此之后的每一个,删除arrays自身。就像是:
// when you are done with them
for(auto i = 0; i < subarrays; i++)
{
delete[] arrays[i];
}
delete[] arrays;
Run Code Online (Sandbox Code Playgroud)
作为旁注,您应该考虑在此代码中使用智能指针。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |