new 和 delete 的问题

时间:2008-06-12 13:11:20   来源:论坛整理  作者:  编辑:chinaitzhe
我在debug的时候 弹出窗口说
Unhandled exception at 0x10252758 (msvcr80d.dll) in gl2.exe: 0xC0000005: Access violation reading location 0xccccccc0.

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





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void env::releaseField()

{

  delete [] _frameBuf;

  _frameBuf = 0;



  if (_field)

  {

    for (int i=0; i<_dimX;   i)

      delete [] _field[i];



    delete [] _field;

   _field = 0;

  }

}





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





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void env::initField()

{

    releaseField();//[color=#FF0000]假如把这句话删掉,就不会出现错位了,这回为什么呢?[/color]

    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;                

        }

    }

}





谢谢大家了
网友回复:初始化时,确保_field为NULL
网友回复:delete [] _frameBuf;
这句话没判定是否为空
网友回复:delete [] _frameBuf;

假如你的_frameBuf还没有new的话,就会出错。
先判定是不是new过了,再delete
网友回复: for (int i=0; i <_dimX; i)
delete [](int *) field ;
_field = NULL;

网友回复:不好意思,发错了,如下才是
//for (int i=0; i <_dimX; i) 这个不要了,
delete [](int *) _field ;
_field = NULL;
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/









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();//[color=#FF0000]假如把这句话删掉,就不会出现错位了,这回为什么呢?[/color]

    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;                

        }

    }

}






网友回复:多谢大家帮助,但是我用各位提到的解决方案仍然不能解决问题...
无论是这样也好
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





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 ;

}







或是这样也好

C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void env::releaseField()

{

  if ( _frameBuf ){

  delete [] _frameBuf;

  _frameBuf = 0;

  }

  delete  [](int *)  _field ; 

  _field = NULL; ...

}






网友回复:我看了其他一些资料,说这个错误可能是指针越界或访问了未初始化的指针引起的,可是代码中也没看到那里有问题阿
网友回复:if (_field)
{
for (int i=0; i <_dimX; i)
delete [] _field[i];

delete [] _field;
_field = 0;
}

假如_field初始化不为NULL,则进行删除操作,会崩溃的
网友回复:还有同样的函数我在解析函数中调用就没出现错误
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void env::killScene()

{

  releaseFishes();

  releaseField();

}



env::~env()

{

    killScene();

}





这样都没问题
网友回复:
引用 9 楼 ouyh12345 的回复:
if (_field)
{
for (int i=0; i <_dimX; i)
delete [] _field[i];

delete [] _field;
_field = 0;
}

假如_field初始化不为NULL,则进行删除操作,会崩溃的

我有些不太明白
if(_field)...这里不是已经判定_field是不是NULL了吗?
网友回复:env::releaseField 函数加一个断点,单步调式看到底到哪有问题。假如是内存分配很大的情况下分配完内存判定一下是否分配成功也是很好的。_field 的申明为什么没有写上呢。
网友回复: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);注释掉了 ,为方便调试我补了一个类,
上面的代码运行没问题了 不知道是不是楼主想要的
网友回复:j_willl,多谢,找到了愚蠢的错误,忘了在构造函数中把_field 与 _frameBuf初始化了,谢谢给分
关键字:new,delete,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面