这个问题是这样的,在debug版下,一切正常,可是换到Release后,明明一个CArray数组arTemp还没有添加任何元素呢,而判断if(arTemp.GetSize() > 0)这句话居然也能成立,结果就是导致我的程序在取索引时越界、崩溃,这是什么原因呢,我在Release下调试,让nCount = arTemp.GetSize(),结果nCount显示好象为58679,那显然大于0,这是什么原因呢,我快绝望了,最后把程序重集成了遍,我的程序不算小,是哪里有冲突吗,反正重集成后问题不见,可没找到真正原因,我内心还是不踏实,怕以后再出现,我就真的要疯了,请大家帮忙。
解决方案 »
- 100分找人解决CBitmap写bmp文件问题
- 有了#if !defined(AFX_ 和 #pragma once 全局对象的定义为什么还不能写在头文件中
- Windows 程序设计
- gethostbyname()函数问题
- 如何把视图分割
- 类型转换问题
- 嵌入mmx指令出错,请高手帮帮忙。
- 求教!!!!
- SOCKET对象之间能直接赋值吗?怎么才能把一个SOCKET对象赋值给另一个?
- MFC奇怪的问题,给控件添加一个变量,程序可以编译链接成功,但就是不能运行,双击程序窗口不出来,在任务管理器中也看不到进程,但是删掉那个变量就正常了,请教高手
- 问一个制作安装程序的问题
- 200分求一个从CArray类派生的类的源代码,最少要重载了“=”和“[]”操作符
是不是要过年了,软件也收尾了。你的遭遇我深表同情,深切关注ing,不要分。
你在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.
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()的第一个参数是设置元素大小,第二个参数是预分配的单元量(即先分配一个大的缓冲)
问题解决了,不是SetSize()的问题,是工程文件受到破坏,中国城市最近老闹电荒,所以程序正在编译,突然就停电了,或者有时还没编译,也就是还没存盘呢也突然眼前一黑,非常郁闷,而且这后遗症还这么难发现,我有一个工程,到现在也打不开,就是当时突然停电了,这是怎么回事,如何修补因停电导致破损的工程文件呢?