2017-05-03 166 views
-1

动态转换在其工作的相同功能中失败。 动态转换在调用commitTransaction之前工作,在commitTransaction之后失败。 在commitTransaction中,在执行删除和新操作的地方调用复制操作符。关于这里发生了什么的任何想法?我读到堆损坏可能会导致dynamic_cast失败。任何人都可以解释为什么发生这种情况?动态转换失败原因

#include <iostream> 
#include <string> 

using namespace std; 
#define num 10000 
#define numOfWords 10000 
class RollbackAllocator                   
{  
    public: 
    int* memBitMap; 
    RollbackAllocator & operator=(const RollbackAllocator& rollBack)            
    {                            
     delete[] memBitMap;                      

     if(rollBack.memBitMap)                      
     {                           
      memBitMap = new int[num];                   
      for(int i = 0;i<num;i++)                   
      {                          
       memBitMap[i] = rollBack.memBitMap[i];                
      }        
     }                           
     else                          
     {                           
      memBitMap = 0;                       
     }                           
     return *this;                        
    }; 
    void init() 
    { 
     memBitMap = new int[num]; 
    } 

}; 

class ResourceAllocator 
{ 
    public: 
    int temp; 
    virtual int tempMethod(){ 
     temp = 0; 
     }; 
}; 

class KatanaResourceAllocator : public ResourceAllocator 
{ 
    public: 
    RollbackAllocator mIFPBPDUEntryIndexAllocatorNM; 
    RollbackAllocator mIFPBPDUEntryIndexAllocatorNMShadow; 
    void commitTransaction() 
    { 
     mIFPBPDUEntryIndexAllocatorNMShadow = mIFPBPDUEntryIndexAllocatorNM; 
    } 
}; 

int main() { 

ResourceAllocator * resourceAllocator = new KatanaResourceAllocator(); 
    KatanaResourceAllocator * allocator = dynamic_cast<KatanaResourceAllocator *>(resourceAllocator); //dynamic_cast works fine type().name= P17ResourceAllocator 
    cout<< " pre allocator=" << allocator; 
    allocator->mIFPBPDUEntryIndexAllocatorNM.init(); 
    allocator->mIFPBPDUEntryIndexAllocatorNMShadow.init(); 
    allocator->commitTransaction(); 
    allocator = dynamic_cast<KatanaResourceAllocator *>(resourceAllocator); //allocator is null here type().name= P17ResourceAllocator 
    cout<<" post allocator=" << allocator; 

    return 0; 
} 
+0

首先,是否存在memBitMap在被operator =调用之前可以为null的情况?删除缓冲区之前可能需要检查一下。 – AlexG

+0

什么是'cout << typeid(mPPSubSys-> getResourceAllocator())。name'?它不是本身为空吗? –

+0

@AlexG内部不会删除检查null吗? –

回答

-1

该代码通过复制未初始化int值会导致未定义的行为。具体地,线:

memBitMap[i] = rollBack.memBitMap[i]; 

rollBack.memBitMap[i]表示由new int[num];,不初始化该值创建一个int

+0

我的主要担心是为什么dynamic_cast失败?复制未初始化的int值会导致动态转换失败吗? –

+0

@TejasPawar你需要发布显示问题的实际代码才能得到更具体的答案,评论似乎表明你发布的代码甚至对自己来说也没有显示问题(这完全没用) –