new 和 delete 的问题

sprawd 2008-06-12 10:14:22
我在debug的时候 弹出窗口说
Unhandled exception at 0x10252758 (msvcr80d.dll) in gl2.exe: 0xC0000005: Access violation reading location 0xccccccc0.

我在代码中找了一下可能是下面这个函数的问题,虽然我找到了位置,但是,我不知道哪里错了~~
这是这个函数,用来归还内存

void env::releaseField()
{
delete [] _frameBuf;
_frameBuf = 0;

if (_field)
{
for (int i=0; i<_dimX; ++i)
delete [] _field[i];

delete [] _field;
_field = 0;
}
}


这个函数在下面这里用到:在初始化的时候,先清理存。

void env::initField()
{
releaseField();//如果把这句话删掉,就不会出现错位了,这回为什么呢?
releaseFishes();

_dimX = _simWidth;
_dimY = _simHeight;

_frameBuf = new GLubyte[3 * _dimX * _dimY];

ZeroMemory(_frameBuf, _dimX * _dimY * 3);

_field = new int*[_dimX]; ///首先定义多少列column
for( int c = 0; c<_dimX; c++){
_field[c] = new int[_dimY]; ///在定义多少行
for( int r =0; r<_dimY; r++){
_field[c][r]=tpSEA;
}
}
}


谢谢大家了
...全文
156 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzctiantian 2009-09-24
  • 打赏
  • 举报
回复
多谢了,碰到同样问题,看过之后发现是基类中的成员变量在子类中没被调用,而自己忽略了赋值,导致指针越界,内存出问题。
sprawd 2008-06-12
  • 打赏
  • 举报
回复
j_willl,多谢,找到了愚蠢的错误,忘了在构造函数中把_field 与 _frameBuf初始化了,谢谢给分
j_willl 2008-06-12
  • 打赏
  • 举报
回复
int _simWidth=100 ;
int _simHeight=100;
class env
{
public:
env():_frameBuf(NULL){ initField();}
~env(){releaseField();}
void initField();
void releaseField();
private:
int *_frameBuf;
int **_field;
int _dimX,_dimY;


};
/////////////////////////////////////////////
void env::releaseField()
{
if(_frameBuf)
{
delete [] _frameBuf;
_frameBuf = 0;

if (_field)
{
for (int i=0; i<_dimX; ++i)
delete [] _field[i];

delete [] _field;
_field = 0;
}
}
}
//////////////////////////////////////////////
/////////////////////////////////////////////////
void env::initField()
{
if(_frameBuf)
releaseField();//如果把这句话删掉,就不会出现错位了,这回为什么呢?
//releaseFishes();

_dimX = _simWidth;
_dimY = _simHeight;

_frameBuf = new int[3 * _dimX * _dimY];

//ZeroMemory(_frameBuf, _dimX * _dimY * 3);

_field = new int*[_dimX]; ///首先定义多少列column
for( int c = 0; c<_dimX; c++){
_field[c] = new int[_dimY]; ///在定义多少行
for( int r =0; r<_dimY; r++){
_field[c][r]=0;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
env a;
a.initField();
a.releaseField();
a.~env();
return 0;

}
小弟把没有给出定义的函数releaseFishes();ZeroMemory(_frameBuf, _dimX * _dimY * 3);注释掉了 ,为方便调试我补了一个类,
上面的代码运行没问题了 不知道是不是楼主想要的
stream2009 2008-06-12
  • 打赏
  • 举报
回复
env::releaseField 函数加一个断点,单步调式看到底到哪有问题。如果是内存分配很大的情况下分配完内存判断一下是否分配成功也是很好的。_field 的申明为什么没有写上呢。
sprawd 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ouyh12345 的回复:]
if (_field)
{
for (int i=0; i <_dimX; ++i)
delete [] _field[i];

delete [] _field;
_field = 0;
}

如果_field初始化不为NULL,则进行删除操作,会崩溃的
[/Quote]
我有些不太明白
if(_field)...这里不是已经判断_field是不是NULL了吗?
sprawd 2008-06-12
  • 打赏
  • 举报
回复
还有同样的函数我在解析函数中调用就没出现错误

void env::killScene()
{
releaseFishes();
releaseField();
}

env::~env()
{
killScene();
}


这样都没问题
ouyh12345 2008-06-12
  • 打赏
  • 举报
回复
if (_field)
{
for (int i=0; i<_dimX; ++i)
delete [] _field[i];

delete [] _field;
_field = 0;
}

如果_field初始化不为NULL,则进行删除操作,会崩溃的
sprawd 2008-06-12
  • 打赏
  • 举报
回复
我看了其他一些资料,说这个错误可能是指针越界或访问了未初始化的指针引起的,可是代码中也没看到那里有问题阿
sprawd 2008-06-12
  • 打赏
  • 举报
回复
多谢大家帮助,但是我用各位提到的解决方案仍然不能解决问题...
无论是这样也好

void env::releaseField()
{
if ( _frameBuf ){
delete [] _frameBuf;
_frameBuf = 0;
}
//确保 _field 的下标 要小于 _dimX 值。
for (int i=0; i<_dimX; ++i)
if ( _field[i] ) delete [] _field[i] , _field[i] = NULL ;
if ( _field ) delete []_field , _field = NULL ;
}



或是这样也好


void env::releaseField()
{
if ( _frameBuf ){
delete [] _frameBuf;
_frameBuf = 0;
}
delete [](int *) _field ;
_field = NULL; ...
}

chen_jun_fen 2008-06-12
  • 打赏
  • 举报
回复




void env::releaseField()
{
if ( _frameBuf ){
delete [] _frameBuf;
_frameBuf = 0;
}
//确保 _field 的下标 要小于 _dimX 值。
for (int i=0; i<_dimX; ++i)
if ( _field[i] ) delete [] _field[i] , _field[i] = NULL ;
if ( _field ) delete []_field , _field = NULL ;
}


void env::initField()
{
releaseField();//如果把这句话删掉,就不会出现错位了,这回为什么呢?
releaseFishes();

_dimX = _simWidth;
_dimY = _simHeight;

_frameBuf = new GLubyte[3 * _dimX * _dimY];

ZeroMemory(_frameBuf, _dimX * _dimY * 3);

_field = new int*[_dimX]; ///首先定义多少列column ? 应该确保多少行把 ?
for( int c = 0; c<_dimX; c++){
_field[c] = new int[_dimY]; ///在定义多少行 ? 应该定义多少列 把 ?
for( int r =0; r<_dimY; r++){
_field[c][r]=tpSEA;
}
}
}

古月无华 2008-06-12
  • 打赏
  • 举报
回复
不好意思,发错了,如下才是
//for (int i=0; i <_dimX; ++i) 这个不要了,
delete [](int *) _field ;
_field = NULL;
古月无华 2008-06-12
  • 打赏
  • 举报
回复
for (int i=0; i<_dimX; ++i)
delete [](int *) field ;
_field = NULL;
coverallwangp 2008-06-12
  • 打赏
  • 举报
回复
delete [] _frameBuf;

如果你的_frameBuf还没有new的话,就会出错。
先判断是不是new过了,再delete
babyvox1999 2008-06-12
  • 打赏
  • 举报
回复
delete [] _frameBuf;
这句话没判断是否为空
ouyh12345 2008-06-12
  • 打赏
  • 举报
回复
初始化时,确保_field为NULL

64,676

社区成员

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

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