注册 登录
编程论坛 C++教室

一个莫名其妙的delete错误,请大大门指点一二

flashboy84 发布于 2011-08-21 23:30, 473 次点击
刚刚写了个shell排序的程序,在最后delete指针的时候莫名奇妙的出错了,各位帮忙看看到底是怎么回事。
程序源代码如下:

程序代码:

#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

const int len = 15;
int switch_num = 0;

int* CreateArray(int n)
{
    int* p = new int[n];

    *(p+0) = 26;
    *(p+1) = 78;
    *(p+2) = 39;
    *(p+3) = 60;
    *(p+4) = 30;
    *(p+5) = 87;
    *(p+6) = 30;
    *(p+7) = 57;
    *(p+8) = 55;
    *(p+9) = 6;
    *(p+10) = 41;
    *(p+11) = 19;
    *(p+12) = 62;
    *(p+13) = 49;
    *(p+14) = 40;

    return p;
}

int* CreateRandomArray(int n)
{
    srand(time(NULL));

    int* p = new int[n];
    for (int i = 0; i < n; ++i)
    {
        p[i] = rand() % 100;
    }

    return p;
}

int* CopyArray(int* p, int n)
{
    int i;

    int* pArr = new int[n];

    for (i = 0; i < n; ++i)
    {
        pArr[i] = p[i];
    }

    return pArr;
}

void PrintArray(int* p, int n)
{
    int i;

    for (i = 0; i < n; ++i)
    {
        cout << p << " ";
    }
    cout << endl;
}

void Switch(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}



//////////////////////////////////////////////////////////////////////
//希尔排序
void ShellSort(int* p, int n)
{
    int i, j, k;

    for (int gap = n / 2; gap > 0; gap = gap / 2)
    {
        for (k = 0; k < gap; ++k)
        {
            for (i = k + gap; i < n; i += gap)
            {
                for (j = i; j > 0; j -= gap)
                {
                    if (p[j] < p[j-gap])
                    {
                        Switch(p[j], p[j-gap]);
                        ++switch_num;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        PrintArray(p, n);
    }
}



//////////////////////////////////////////////////////////////////////
int main()
{
    cout << "Hello world!" << endl;

    srand(time(NULL));

    int* pArr;

    cout << "before sort: " << endl;

    pArr = CreateArray(len);
    //pArr = CreateRandomArray(len);
    PrintArray(pArr, len);

    cout << endl << endl;

    switch_num = 0;
    int* pArrShell = CopyArray(pArr, len);
    ShellSort(pArrShell, len);
    cout << "after shell sort:" << endl;
    PrintArray(pArrShell, len);
    cout << "switch number is: " << switch_num << endl << endl;
    delete[] pArrShell;  //就是在这个位置出错的

    delete[] pArr;

    return 0;
}


[ 本帖最后由 flashboy84 于 2011-8-22 00:52 编辑 ]
6 回复
#2
xg56992011-08-22 11:42
是错在希尔排序这里,只不过我不懂希尔排序,给你个编译通过的程序,希望对你有提示帮助
程序代码:
#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

const int len = 15;
int switch_num = 0;

int* CreateArray(int n)
{
    int* p = new int[n];

    *(p+0) = 26;
    *(p+1) = 78;
    *(p+2) = 39;
    *(p+3) = 60;
    *(p+4) = 30;
    *(p+5) = 87;
    *(p+6) = 30;
    *(p+7) = 57;
    *(p+8) = 55;
    *(p+9) = 6;
    *(p+10) = 41;
    *(p+11) = 19;
    *(p+12) = 62;
    *(p+13) = 49;
    *(p+14) = 40;

    return p;
}

int* CreateRandomArray(int n)
{
    srand(time(NULL));

    int* p = new int[n];
    for (int i = 0; i < n; ++i)
    {
        p[i] = rand() % 100;
    }

    return p;
}

int* CopyArray(int *p, int n)
{
    int i;

    int* pArr = new int[n];

    for (i = 0; i < n; ++i)
    {
        pArr[i] = p[i];
    }

    return pArr;
}

void PrintArray(int* p, int n)
{
    int i;

    for (i = 0; i < n; ++i)
    {
        cout << p << " ";
    }
    cout << endl;
}

void Switch(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}



//////////////////////////////////////////////////////////////////////
//希尔排序
void ShellSort(int* p, int n)
{
    int i, j, k;

    for (int gap = n / 2; gap > 0; gap = gap / 2)
    {
        for (k = 0; k < gap; ++k)
        {
            for (i = k + gap; i < n; i += gap)
            {
                for (j = i; j > 0; j -= gap)
                {
                    if (p[j] < p[j-gap])
                    {
                        Switch(p[j], p[j-gap]);
                        ++switch_num;
                    }
                    else    //另外直接去掉else也能通过,给我的感觉就是数组越界,就是将[15]的这个数组赋值了,导致在delete释放过程中遇到heap corruption问题
/*
      举个例子来说就是
      //      #include <iostream>
             using namespace std;
             void main()
             {
               int *a=new int[2];
               a[2]=5;
               delete []a;
              }
            输出就是和你一模一样的错误
*/
                    {
                        break;
                    }
                }
                }
            break; //增加break就能通过,只不过结果不是与你的程序相符.
           
        }
      
        PrintArray(p, n);
    }
}



//////////////////////////////////////////////////////////////////////
int main()
{
    cout << "Hello world!" << endl;

    srand(time(NULL));

    int* pArr;

    cout << "before sort: " << endl;

    pArr = CreateArray(len);
    //pArr = CreateRandomArray(len);
    PrintArray(pArr, len);

    cout << endl << endl;

    switch_num = 0;
    int* pArrShell = CopyArray(pArr,len);

    ShellSort(pArrShell, len);
    cout << "after shell sort:" << endl;
    PrintArray(pArrShell, len);
    cout << "switch number is: " << switch_num << endl << endl;
   
    delete  []pArrShell;  
    delete []pArr;
  
    return 0;
   
}





 

[ 本帖最后由 xg5699 于 2011-8-22 11:58 编辑 ]
#3
flashboy842011-08-22 21:02
谢谢xg5699的指导,我觉得你说的情况很可能出现,我好好研究下,多谢了。。。
#4
flashboy842011-08-23 00:04
我找到错误了,在循环j的时候,判断条件应该是j>=gap,否则会造成越界…多谢大大的指点,跪谢了…
#5
xg56992011-08-23 10:49
回复 4楼 flashboy84
不在家要晚上回去,能这么快发现错误很厉害
本想到家后写个operator[]重载函数防止数组越界,这样就算
for循环错误编译也不会出错,当然能自己找到错误
那是最好的。
#6
ljw9702432011-08-24 14:23
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
const int len = 15;
int switch_num = 0;
int* CreateArray(int n)
{
    int* p = new int[n];
    *(p+0) = 26;
    *(p+1) = 78;
    *(p+2) = 39;
    *(p+3) = 60;
    *(p+4) = 30;
    *(p+5) = 87;
    *(p+6) = 30;
    *(p+7) = 57;
    *(p+8) = 55;
    *(p+9) = 6;
    *(p+10) = 41;
    *(p+11) = 19;
    *(p+12) = 62;
    *(p+13) = 49;
    *(p+14) = 40;
    return p;
}

int* CreateRandomArray(int n)
{
    srand(time(NULL));
    int* p = new int[n];
    for (int i = 0; i < n; ++i)
        p[i] = rand() % 100;
    return p;
}
int* CopyArray(int* p, int n)
{
    int i;
    int* pArr = new int[n];
    for (i = 0; i < n; ++i)
       pArr[i] = p[i];
    return pArr;
}

void PrintArray(int* p, int n)
{
    int i;
    for (i = 0; i < n; ++i)
        cout << *(p++) << " ";
    cout << endl;
}

void Switch(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}



//////////////////////////////////////////////////////////////////////
//希尔排序
void ShellSort(int* p, int n)
{
    int i, j, k;

    for (int gap = n / 2; gap > 0; gap = gap / 2)
    {
        for (k = 0; k < gap; ++k)
        {
            for (i = k + gap; i < n; i += gap)
            {
                for (j = i; j > 0; j -= gap)
                {
                    if(j<gap)continue;//有时j比gap小,要检测一下,否则会越界
                     if (p[j] < p[j-gap])
                    {
                        Switch(p[j], p[j-gap]);
                        ++switch_num;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        PrintArray(p, n);
    }
}



//////////////////////////////////////////////////////////////////////
int main()
{
    cout << "Hello world!" << endl;

    srand(time(NULL));

    int* pArr;

    cout << "before sort: " << endl;

    pArr = CreateArray(len);
    //pArr = CreateRandomArray(len);
    PrintArray(pArr, len);

    cout << endl << endl;

    switch_num = 0;
    int* pArrShell = CopyArray(pArr, len);
    ShellSort(pArrShell, len);
    cout << "after shell sort:" << endl;
    PrintArray(pArrShell, len);
    cout << "switch number is: " << switch_num << endl << endl;
    delete[] pArrShell;  //就是在这个位置出错的

    delete[] pArr;

    return 0;
}
#7
开了口的记忆2011-09-02 11:46
循环的时候出了问题吧?
1