Chinaunix
标题:
在Ubuntu下运行会段错误,Win下可以正常运行,为什么?
[打印本页]
作者:
janusle
时间:
2006-12-22 23:41
标题:
在Ubuntu下运行会段错误,Win下可以正常运行,为什么?
以下是我数据结构课程中的一个作业.我在Ubuntu下用g++编译后,运行会显示"段错误",但是在Win下用g++编译后,运行没有提示.我不知道我哪里出问题了.用gdb调试,程序似乎是在其中的一个FilterDown函数中中断的.但是我看不出问题.诸位帮忙看看.
#include<iostream>
using namespace std;
class heap{
public:
heap(int size = 10):maxsize(size) , currentsize(0) { heapArray = new int[10]; }
heap(int a[] , int size); //通过一个数组构建一个堆.
~heap(){delete [] heapArray;}
int getTop(){return heapArray[0];}
bool deletetop(); //删除堆顶
bool insert(int data); //插入一个元素
bool isempty() const{ return currentsize == 0; }
bool isfull() const{ return currentsize == maxsize; }
int sizeofheap() { return currentsize; }
void setempty(){ currentsize = 0 ;}
private:
int *heapArray;
int currentsize;
int maxsize;
void FilterDown(int p); //向下调整函数
void FilterUp(int p ); //想上调整函数
};
bool heap::deletetop()
{
if ( currentsize == 0 )
return false;
heapArray[0] = heapArray[currentsize-1];
currentsize--;
FilterDown(0);
return true;
}
bool heap::insert(int data)
{
if ( currentsize == maxsize )
return false;
heapArray[currentsize] = data;
FilterUp(currentsize);
currentsize++;
return true;
}
void heap::FilterUp(int p)
{
int temp;
int i = p;
int j = (i - 1) / 2;
while( j >= 0 )
{
if ( heapArray[i] < heapArray[j] )
{
temp = heapArray[i];
heapArray[i] = heapArray[j];
heapArray[j] = temp;
}
else
break;
i = j;
j = (j - 1) / 2;
}
}
heap::heap(int a[] , int size)
{
maxsize = size + 10;
heapArray = new int[maxsize];
heapArray = a;
currentsize = size;
int i = (currentsize - 2) / 2;
while(i >= 0)
{
FilterDown(i--);
}
}
void heap::FilterDown(int p)
{
int i = p;
int j = i * 2 + 1;
int temp;
while ( j < currentsize )
{
if ( ( (j + 1) < currentsize ) && ( heapArray[j] > heapArray[j+1] ) )
j++;
if ( heapArray[i] > heapArray[j] )
{
temp = heapArray[i];
heapArray[i] = heapArray[j];
heapArray[j] = temp;
}
else
break;
i = j;
j = j * 2 + 1;
}
}
int main()
{
int a[] = {80 , 57 , 99 , 35 , 23 , 11 , 74 , 29 , 62 , 16};
heap b(a , 10);
b.insert(14);
b.deletetop();
}
复制代码
作者:
cjaizss
时间:
2006-12-22 23:47
自己学着拿gdb调
作者:
cjaizss
时间:
2006-12-23 01:31
不过最后好心的我还是帮你看了一下。
错误居然发生在bool heap::insert(int data)里的
heapArray[currentsize] = data;
watch heapArray,发现,居然是这句修改了heapArray的值
很绯疑所思是吗?
哦,原来heapArray本来指着main里的a数组,a的长度是10;
currentsize 也是10,哦,越界。
而且正好heapArray[current]存的就是heapArray这个变量。
教训啊,这个故事告诉我们越界访问的后果是多么的严重
作者:
janusle
时间:
2006-12-23 13:09
谢谢,谢谢。我不应该直接指向那个数组,应该复制一下。呵呵
指针看来是很危险的东西!
[
本帖最后由 janusle 于 2006-12-23 14:12 编辑
]
作者:
ssffzz1
时间:
2006-12-23 13:47
Windows的检测机制没有linux的严格.
作者:
galaxywar
时间:
2006-12-23 18:30
原帖由
ssffzz1
于 2006-12-23 13:47 发表
Windows的检测机制没有linux的严格.
不是这个原因. 越界访问未必一定会core dump, 如果你访问的地址对当前进程是有效而且可读的就不会有事(对于读来说), 具有一定偶然性. 这个版里以前有篇贴子是关于malloc实现,还有sbrk()和brk()的讨论, 可以看一下.
据我碰到过的一些跨平台的程序, 明明有越界访问, 在Unix下就是比在Windows下容易重现的多. 我估计是windows下内存分配机制有所不同,到底有什么不同, 我也不清楚.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2