求助关于运行时Segmentation fault(coredump)错误

lunugno 2014-05-29 03:19:09
是一个自己实现动态数组类的小程序。调试编译通过了~,运行出现此错误,新手不知该怎么办。


源程序:

头文件:
#ifndef MYARRAY

#define MYARRAY

class CMyArray
{
public:
CMyArray(); //默认构造函数:默认分配10个long类型空间,增量为5
CMyArray(int nCount,int nIncrem); //构造函数:分配nCount个long类型空间,增量为nIncrem
~CMyArray(); //构造函数:释放所有空间,防止内存泄露

private:
void init(); // initilize the array
int InvalidateIndex(int nIndex); // judge the validate of an index

protected:
int m_nDataCount; //数据总数量
int m_nSize; //空间大小
int m_nIncrem; //若空间不足后,每次分配增量值
long *m_nData; // 所分配内存的头指针
void grow(int m); //分配增量

public:
int AddData (long nData); //在尾部添加一个数据nData,返回其索引值
bool DeleteData(int nIndex); //删除指定索引nIndex的数据(其后数据会前移,不允许留有空位)
int GetDataCount(); //获取数据总数量
bool GetData(int nIndex); //获取指定索引nIndex的数据
void Clean(); //清空数据nData,并释放空间
void Display();
};

#endif

方法文件:
#include "myarray.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

CMyArray::CMyArray() //默认分配10个long类型空间,增量为5
{
long *m_nData=new long[10];
m_nSize = 10;
}

CMyArray:: CMyArray(int nCount,int nIncrem) //构造函数:分配nCount个long类型空间,增量为nIncrem
{
long *m_nData=new long[nCount];
m_nSize = nCount;
m_nIncrem = nIncrem;

}

CMyArray:: ~CMyArray() //析构函数:释放所有空间,防止内存泄露
{
Clean();
}

void CMyArray::init()
{
m_nData = NULL;
m_nSize = 0;
m_nDataCount = 0;
}

void CMyArray::Clean () //清空数据nData,并释放空间
{
delete [ ] m_nData;
}

void CMyArray::grow(int m)
{
if(m_nData != NULL)
{

long * m_nDataN = new long[m_nSize +m ];
memcpy(m_nDataN, m_nData, m_nSize);
m_nSize +=m;
delete[] m_nData;
m_nData = m_nDataN;
}
}

int CMyArray::InvalidateIndex(int nIndex)
{
if(nIndex < 0 || nIndex > GetDataCount())
{
return true;
}
else
{
return false;
}
}

int CMyArray::GetDataCount() //获取数据总数量
{
return m_nDataCount;
}


bool CMyArray::GetData(int nIndex) //获取指定索引nIndex的数据
{
if( InvalidateIndex(nIndex) )
{
cout<<"Index is invalide in GetData()!"<<endl;
return false;
}
else
{
return m_nData[nIndex];
}
}

bool CMyArray::DeleteData(int nIndex) //删除指定索引nIndex的数据(其后数据会前移,不允许留有空位)
{
if( InvalidateIndex(nIndex) )
{
cout<<"Index is invalide in RemoveAt()!"<<endl;
return false;
}
else
{
for( int i=nIndex; i<m_nDataCount-1; i++ )
{
m_nData[i] = m_nData[i+1];
}
m_nDataCount--;
return true;
}


}
int CMyArray::AddData(long nData) //在尾部添加一个数据nData,返回其索引值
{
if( m_nDataCount < m_nSize )
{
m_nData[m_nDataCount] = nData;
m_nDataCount++;
}
else
{
//assert( m_nDataCount == m_nSize );

if( m_nSize == 0 )
{
m_nSize = 1;
}
else
{
m_nSize *= 2;
}

long *pTemp=NULL;
pTemp = new long [m_nSize];
if( pTemp == NULL )
{
cout<< "Can not alloc memory in PushBack()!" << endl;
return 0;
}

for( int i=0; i<m_nDataCount; i++ )
{
pTemp[i] = m_nData[i];
}
pTemp[m_nDataCount] = nData;

delete[] m_nData;
m_nData = pTemp;
m_nDataCount++;
}
return true;
}

void CMyArray::Display()
{
cout<<"m_nSize= "<< m_nSize <<" DataCount= "<<GetDataCount()<<":";
for(int i=0; i<GetDataCount(); i++)
{
cout<<" "<<GetData(i);
}
cout<<endl;
}


测试文件 主程序:

#include "myarray.h"
#include <iostream.h>
void main()
{
CMyArray a;
a.AddData(10);
a.Display();
}


谢谢各位了
...全文
400 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-06-03
  • 打赏
  • 举报
回复
编译时加-g
anshiny 2014-06-03
  • 打赏
  • 举报
回复
大概看了一下,可能的错误是:
CMyArray::CMyArray()                           //默认分配10个long类型空间,增量为5
{
    long *m_nData=new long[10];
    m_nSize = 10;
}

CMyArray:: CMyArray(int nCount,int nIncrem)       //构造函数:分配nCount个long类型空间,增量为nIncrem
{
    long *m_nData=new long[nCount];
    m_nSize = nCount;
    m_nIncrem = nIncrem;
}
应写成:
CMyArray::CMyArray()                           //默认分配10个long类型空间,增量为5
{
    m_nData=new long[10];
    m_nSize = 10;
    m_nDataCount = 0;
}

CMyArray:: CMyArray(int nCount,int nIncrem)       //构造函数:分配nCount个long类型空间,增量为nIncrem
{
    m_nData=new long[nCount];
    m_nSize = nCount;
    m_nIncrem = nIncrem;
    m_nDataCount = 0;
}
lunugno 2014-06-03
  • 打赏
  • 举报
回复
我按你的做 ,可是打不开。只能在ultraeidit 看到core文件内容~~~
赵4老师 2014-06-03
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
lunugno 2014-06-03
  • 打赏
  • 举报
回复
很长~ 全部截图吗?是这个吗~我是新手 实在不好意思
sduxiaoxiang 2014-06-03
  • 打赏
  • 举报
回复
上core文件栈截图吧
lunugno 2014-06-03
  • 打赏
  • 举报
回复
有没有高手帮我看看代码~我没有查到错误~是指针的问题?还是
lunugno 2014-06-03
  • 打赏
  • 举报
回复
是的 解决了!!谢谢~~~
lunugno 2014-05-29
  • 打赏
  • 举报
回复
太感谢了~ 我先试试!!还不知道这个方法~~~
赵4老师 2014-05-29
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
lunugno 2014-05-29
  • 打赏
  • 举报
回复
请教一下~~~

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧