| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 473 人关注过本帖
标题:一个莫名其妙的delete错误,请大大门指点一二
只看楼主 加入收藏
flashboy84
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-8-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
一个莫名其妙的delete错误,请大大门指点一二
刚刚写了个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 编辑 ]
搜索更多相关主题的帖子: 莫名奇妙 源代码 color 
2011-08-21 23:30
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:20 
是错在希尔排序这里,只不过我不懂希尔排序,给你个编译通过的程序,希望对你有提示帮助
程序代码:
#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 编辑 ]

都不结贴我郁闷那!
2011-08-22 11:42
flashboy84
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-8-21
收藏
得分:0 
谢谢xg5699的指导,我觉得你说的情况很可能出现,我好好研究下,多谢了。。。
2011-08-22 21:02
flashboy84
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-8-21
收藏
得分:0 
我找到错误了,在循环j的时候,判断条件应该是j>=gap,否则会造成越界…多谢大大的指点,跪谢了…
2011-08-23 00:04
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
回复 4楼 flashboy84
不在家要晚上回去,能这么快发现错误很厉害
本想到家后写个operator[]重载函数防止数组越界,这样就算
for循环错误编译也不会出错,当然能自己找到错误
那是最好的。

都不结贴我郁闷那!
2011-08-23 10:49
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
#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;
}
2011-08-24 14:23
开了口的记忆
Rank: 2
等 级:论坛游民
帖 子:30
专家分:14
注 册:2011-8-23
收藏
得分:0 
循环的时候出了问题吧?
2011-09-02 11:46
快速回复:一个莫名其妙的delete错误,请大大门指点一二
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015707 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved