免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1154 | 回复: 0
打印 上一主题 下一主题

[C++] 今天在执行一段程序的时候,遇到个问题,看看大家对它的看法如何 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-11 16:40 |只看该作者 |倒序浏览
我先简要介绍下这个程序的大致结构,再说一下出现的问题:
一、程序结构:
首先是一个自定义的容器类:
  1. INITSIZE 1000
  2. template<typename _T>
  3. class MyOwnVector
  4. {
  5.     MyOwnVector() {
  6.         _Vec_Buffer = NULL;
  7.         m_nCount = 0;
  8.         m_nCapacity = 0;
  9.     }
  10.      
  11.     virtual ~MyOwnVector() {
  12.         delete _Vec_Buffer;
  13.     }
  14.      
  15.     int PushBack(_T value) {
  16.         EnsureSize(m_nCount + 1);
  17.         Get(m_nCount) = value;
  18.         m_nCount++;
  19.         return m_nCount - 1;
  20.     }
  21.      
  22.     void Clear() {
  23.         m_nCount = 0;
  24.         if (_Vec_Buffer != NULL) {
  25.             memset(_Vec_Buffer, 0, sizeof(_T)*m_nCapacity);
  26.         }
  27.     }
  28.      
  29.     protected:
  30.     void EnsureSize(int nNewSize) {
  31.         ...
  32.         _T *pTemp = new _T[m_nCapacity];
  33.         if (pTemp != NULL && _Vec_Buffer != NULL) {
  34.             memcpy(pTemp, _Vec_Buffer, m_nCount * sizeof(_T));
  35.         }
  36.         delete _Vec_Buffer;
  37.         _Vec_Buffer = pTemp;
  38.          
  39.     }

  40.     private:
  41.     int m_nCount;
  42.     int m_nCapacity;
  43.     _T *_Vec_Buffer;
  44. }
复制代码
然后是对它的调用:
  1. typedef map<_Key, CValue*> _objs;
  2. CValue *p_Obj = NULL;
复制代码
  1. releaseIt(_Key key) {
  2. ...
  3. if(p_Obj == iter->second)
  4.    p_Obj = NULL;
  5. delete iter->second;
  6. iter->second = NULL:
  7. }
复制代码
其中CValue类中含有一个MyOwnVector类型对象的成员变量。
执行releaseIt函数的时候,程序崩溃,用WinDbg跟踪的栈信息如下:

ntdll!RtlpNtMakeTemporaryKey+0x38c1
ntdll!EtwSetMark+0x16118
ntdll!RtlValidateHeap+0x7a
KERNELBASE!HeapValidate+0x14
Test!_CrtIsValidHeapPointer(void *pUserData = ...dbgheap.c@2103
Test!_free_dbg_nolock(...)
Test!_free_dbg(...)
Test!operator delete(...)
Test!MyOwnVector<_SomeClass>::~MyOwnVector<_SomeClass>()
Test!~scalar deleting destructor'(void)...
Test!ReleaseIt!

大家对它有什么看法?

注,实际调用时替换模板的那个T的是一个struct,里面除了基本类型外,只有两个类类型的成员变量。这两个类类型的成员变量都是同一类型,且其中只有一个char[1000]数组的成员变量。没有指针成员。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP