动态强制转换在其工作的同一功能中失败。 动态强制转换在调用commitTransaction之前正在工作,并在commitTransaction之后失败。 在commitTransaction中,调用copy运算符,执行delete和new操作。有什么想法在这里发生了什么?我读到堆损坏会导致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 :(得分:-1)
此代码通过复制未初始化的int
值导致未定义的行为。特别是这一行:
memBitMap[i] = rollBack.memBitMap[i];
但rollBack.memBitMap[i]
表示由int
创建的new int[num];
,它不会初始化值。