免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-11 16:37 |只看该作者 |倒序浏览
我先简要介绍下这个程序的大致结构,再说一下出现的问题:
一、程序结构:
首先是一个自定义的容器类:
  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]数组的成员变量。没有指针成员。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-05-11 19:55 |只看该作者
delete _Vec_Buffer;  改成 delete [] _Vec_Buffer;

论坛徽章:
0
3 [报告]
发表于 2014-05-11 23:43 |只看该作者
hellioncu 发表于 2014-05-11 19:55
delete _Vec_Buffer;  改成 delete [] _Vec_Buffer;


试过了,还是崩溃。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
4 [报告]
发表于 2014-05-12 12:32 |只看该作者
enable pageheap

论坛徽章:
0
5 [报告]
发表于 2014-05-12 13:48 |只看该作者
回复 4# irp

能说得详细些吗?谢谢!


   

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2014-05-12 14:25 |只看该作者
_T *pTemp = new _T[m_nCapacity];
明显不对。已知代码来看,m_nCapacity是0吧!!!!

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [报告]
发表于 2014-05-12 14:55 |只看该作者

    除非你能保证struct的对象成员的成员也都是POD类型,否则你的memcpy和memset都会**对象的内存模型,新的内存区域的生成不能简单的使用
    memcpy来copy既存的对象,应该使用plancement new逐个的copy对象(调用操作符或者copy constructor),而不是直接生成数组了事。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
8 [报告]
发表于 2014-05-13 12:39 |只看该作者
一看到类模板里面的函数名首字母大写, 我就知道我对这代码没有任何看法了...

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
9 [报告]
发表于 2014-05-13 17:36 |只看该作者
havent2012 发表于 2014-05-12 13:48
回复 4# irp

能说得详细些吗?谢谢!


windbg help 里面有讲, search pageheap.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP