我试图将vc7.1项目转换为vs2010,这是我从codeproject获得的。(这里是链接htt p://www.codeproject.com/KB/cpp/transactions.aspx?fid = 11253& df = 90&安培; MPP = 50&安培;噪声= 3及排序=位置&安培;图=膨化&安培; FR = 1#xx0xx
但转换并修改其配置后。
我发现它调试失败,它在DrawIt.exe中的0x0028e7b9处显示未处理的异常:0xC0000005:访问冲突写入位置0x00000000。
错误行就像这样
data = new(Mm::Allocate(sizeof(DocData), sid)) DocData();
功能
void* Allocate(size_t size, SPACEID sid)
{
AUDIT
Spaces::iterator s = spaces.find(sid);
if (s == spaces.end())
return NULL;
Space& space = s->second;
if (!space.transacting)
return NULL;
size = max(size, sizeof(Free));
// TODO: assert that "data" is allocated in space
space.AssertData();
// are there any more free chunks?
if (!space.data->sFreeHead) {
space.data->Insert(space.More(size));
}
AUDIT
// find the first chunk at least the size requested
Free* prev = 0;
Free* f = space.data->sFreeHead;
while (f && (f->size < size)) {
prev = f;
f = f->next;
}
AUDIT
// if we found one, disconnect it
if (f) {
space.data->locTree.remove((size_t)f);
if (prev) prev->next = f->next;
else space.data->sFreeHead = f->next;
f->next = 0;
memset(&f->loc, 0, sizeof(f->loc));
} else {
f = space.More(size);
}
// f is disconnected from the free list at this point
AUDIT
// if the free chunk is too(?) big, carve a peice off and return
// the rest to the free list
if (f->size > (2*(size + sizeof(Free)))) {
Free* tmp = space.data->Slice(f, size); // slice size byte off 'f'
space.data->Insert(f); // return the remainder to the free list
f = tmp;
}
AUDIT
CHECK_POINTER(f)
void* p = reinterpret_cast<void*>((char*)f + sizeof(Free::SIZE_TYPE));
CHECK_POINTER(p)
return p;
}
任何人都有意,PLZ?
由于我不擅长C ++,所以在我弄清楚如何解决这个问题之前需要一些时间。 刚上传了源代码source file,如果有人可以提供帮助,我们将不胜感激。
答案 0 :(得分:4)
[这个答案可能错了;看到评论意见;我暂时不会删除这个,所以我们可以弄清楚答案是什么]
在多个失败案例中, Allocate
会返回NULL
。
在使用之前,您不会检查调用Allocate
的结果。
您需要检查结果。或者,您可以在发生故障时抛出异常。
答案 1 :(得分:2)
好吧,您的Allocate
功能显然正在返回NULL
。我们很难说出哪里和为什么,并且你自己设置断点并逐步完成分配器是微不足道的,所以我建议你这样做,找出函数返回的位置。