这个问题是这样的,在debug版下,一切正常,可是换到Release后,明明一个CArray数组arTemp还没有添加任何元素呢,而判断if(arTemp.GetSize() > 0)这句话居然也能成立,结果就是导致我的程序在取索引时越界、崩溃,这是什么原因呢,我在Release下调试,让nCount = arTemp.GetSize(),结果nCount显示好象为58679,那显然大于0,这是什么原因呢,我快绝望了,最后把程序重集成了遍,我的程序不算小,是哪里有冲突吗,反正重集成后问题不见,可没找到真正原因,我内心还是不踏实,怕以后再出现,我就真的要疯了,请大家帮忙。

解决方案 »

  1.   

    这几天怎么这种问题特别多???
    是不是要过年了,软件也收尾了。你的遭遇我深表同情,深切关注ing,不要分。
      

  2.   

    我忽然记起一个问题,
    你在getsize()前setsize没有?
    那个58679可能就是自动给你分配的大小。Tip:
      Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.
      

  3.   

    同意楼上,如果没有setsize,使用getsize就得不到正确的结果
      

  4.   

    开发调试软件最好也release方式下面,debug下编译器会插入很多多余的代码,一般就是帮你把没有初始化的变量初始化。release下也可以有调试信息的。我看楼主就是这个问题
      

  5.   

    嗯,没有setsize的话,是动态分配的
      

  6.   

    不对,应该是你原来的程序什么地方出错引起的,或是工程文件什么地方受到破坏,我也遇到过类似问题,重建一个工程把原代码拷进来就正确了.以下是CArray的原代码
    template<class TYPE, class ARG_TYPE>
    CArray<TYPE, ARG_TYPE>::CArray()
    {
    m_pData = NULL;
    m_nSize = m_nMaxSize = m_nGrowBy = 0;
    }template<class TYPE, class ARG_TYPE>
    AFX_INLINE int CArray<TYPE, ARG_TYPE>::GetSize() const
    { return m_nSize; }
    从这两段代码可以看出,在类构造时已经初始化元素大小为0(即:m_nSize = 0;)
    返回元素大小时其返回值就是m_nSize
    所以不存在非得用SetSize()的说法
    SetSize()的第一个参数是设置元素大小,第二个参数是预分配的单元量(即先分配一个大的缓冲)
      

  7.   

    听上去,我也觉得应该是这个问题,所以我在构造函数里放了arTemp.SetSize(0);这句,可是问题仍然存在,我记错了,nCount不是等于58679,而是nCount=5817304,whatever,反正是不应该的,上面这个问题只是我恶梦中的一个,还有一个是程序在Debug下运行没报错,在Release下运行也是可以的,只是在关闭程序时突然来个错误对话框说0Xxxxxxxxx地址不能写,有时也报不能读的错误,这是怎么回事,还有一点,比如在Release的调试运行状态,运行及关闭都正常,而按了叹号执行状态,就又开始报错了,和着这Release的调试和执行的差别也这么明显,大家再给点思路吧。
      

  8.   

    感谢 luxingjyp(无涯) 提醒
    问题解决了,不是SetSize()的问题,是工程文件受到破坏,中国城市最近老闹电荒,所以程序正在编译,突然就停电了,或者有时还没编译,也就是还没存盘呢也突然眼前一黑,非常郁闷,而且这后遗症还这么难发现,我有一个工程,到现在也打不开,就是当时突然停电了,这是怎么回事,如何修补因停电导致破损的工程文件呢?
      

  9.   

    呵呵,要么每隔几分钟就Ctrl+S一次(我现在就是这样),要么重建一个工程,要么建一个相似的工程后比对两个工程的*.DSP,*.DSW文件(我有一次就是这样修复的)