- 论坛徽章:
- 0
|
我先简要介绍下这个程序的大致结构,再说一下出现的问题:
一、程序结构:
首先是一个自定义的容器类:- INITSIZE 1000
- template<typename _T>
- class MyOwnVector
- {
- MyOwnVector() {
- _Vec_Buffer = NULL;
- m_nCount = 0;
- m_nCapacity = 0;
- }
-
- virtual ~MyOwnVector() {
- delete _Vec_Buffer;
- }
-
- int PushBack(_T value) {
- EnsureSize(m_nCount + 1);
- Get(m_nCount) = value;
- m_nCount++;
- return m_nCount - 1;
- }
-
- void Clear() {
- m_nCount = 0;
- if (_Vec_Buffer != NULL) {
- memset(_Vec_Buffer, 0, sizeof(_T)*m_nCapacity);
- }
- }
-
- protected:
- void EnsureSize(int nNewSize) {
- ...
- _T *pTemp = new _T[m_nCapacity];
- if (pTemp != NULL && _Vec_Buffer != NULL) {
- memcpy(pTemp, _Vec_Buffer, m_nCount * sizeof(_T));
- }
- delete _Vec_Buffer;
- _Vec_Buffer = pTemp;
-
- }
-
- private:
- int m_nCount;
- int m_nCapacity;
- _T *_Vec_Buffer;
- }
复制代码 然后是对它的调用:- typedef map<_Key, CValue*> _objs;
- CValue *p_Obj = NULL;
复制代码- releaseIt(_Key key) {
- ...
- if(p_Obj == iter->second)
- p_Obj = NULL;
- delete iter->second;
- iter->second = NULL:
- }
复制代码 其中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]数组的成员变量。没有指针成员。 |
|