为什么在动态分配的数组上调用delete会导致一个崩溃而另一个崩溃?

时间:2017-12-31 10:27:48

标签: c++ arrays pointers dynamic-arrays delete-operator

我正在开发一个合并排序功能。我有一个工作合并功能,但我的分裂功能有一些问题。函数split采用单个int数组及其大小,然后将该数组拆分为两个较小的数组。我的问题是,我不知道为什么在delete []上调用tempArrayL导致崩溃,但是当我在tempArrayR上执行此操作时却没有。

void split(int x[], int size)
{

    if (size == 1)
    return;

    //figure out sizes of smaller arrays
    int leftSize = (size / 2), rightSize = (size - leftSize), mid = (leftSize + 1);


    int* tempArrayL = new int[leftSize]; //array for first half
    for (int z = 0; z != mid; z++)
    {
        tempArrayL[z] = x[z]; //copy from original into new array
    }

    for (int z = 0; z != leftSize; z++)
       cout << tempArrayL[z] << endl; //print out to see if it worked


    int* tempArrayR = new int[rightSize]; //array for second half
    for (int z = mid - 1, j = 0; z != size; j++, z++)
    {
        tempArrayR[j] = x[z]; //copy from original array
    }
    for (int z = 0; z != rightSize; z++)
    cout << tempArrayR[z] << endl; //print out to see if it worked


    delete [] tempArrayL; //causes crash here
    delete [] tempArrayR; //does not cause crash if I comment out tempArrayL

}

以下是它在主

中的使用方法
int main()
{
    const int SIZE = 5;
    int array[] = {3, 2, 5, 9, 10};
    split(array, SIZE);
} 

1 个答案:

答案 0 :(得分:2)

基本上就像@Bo Persson在评论中提到的那样。您正在访问超出范围的元素。 您的tempArrayL被分配了2个元素的大小(仅表示索引{0,1}) 但是在第一个循环中(将元素复制到左侧数组中),循环条件为z!=mid,而mid为3,这意味着您正在访问索引{0,1,2}并且tempArrayL只能有索引{0,1}。因此,索引越界。

长话短说: 替换 for (int z = 0; z != mid; z++)
使用 for (int z = 0; z !=leftSize; z++)
split(int[] x,int size)方法的第一个循环中(将元素复制到左侧数组中)

相关问题