C ++使用子数组释放数组的内存分配

sas*_*ine 2 c++

从理论上讲,如果仅删除以下代码片段中的内容arraysresults而又不删除它的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;
}
Run Code Online (Sandbox Code Playgroud)

ded*_*cos 5

您不应删除,sub_array因为它指向的缓冲区存储在中arrays[n]。因为唯一可以删除的方法sub_array是在声明的块范围内(这是for循环),所以如果删除它,arrays[n]则将是dangling pointer(指向已释放或无效内存块的指针),并且悬空指针是邪恶的

你应该做的关于arrayssub_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)

作为旁注,您应该考虑在此代码中使用智能指针