He intentado convertir un proyecto de vc7.1 a vs2010 que obtuve de codeproject. (Y aquí está el enlace h tt p: //www.codeproject.com/KB/cpp/transactions.aspx? Fid = 11253 & df = 90 & mpp = 50 & ruido = 3 & tipo = Posición & vista = Ampliado & fr = 1 # xx0xx¿La colocación nueva llama al constructor si el puntero pasado es nulo?
Pero después convertida y modificar su configuración.
lo encuentro de depuración, sin éxito, que dice excepción no controlada en 0x0028e7b9 en DrawIt.exe: 0xC0000005: ubicación de escritura de violación de acceso 0x00000000.
La línea de error dice así
data = new(Mm::Allocate(sizeof(DocData), sid)) DocData();
Y la función
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;
}
Alguien tiene idea, PLZ?
Dado que no soy bueno en C++, tomará algún tiempo antes de descubrir cómo resolver este problema. Acabo de subir el código fuente source file, se agradecería si alguien pudiera ayudar.
Esta es una muy buena pregunta que puede reformularse en términos más breves como: * ¿La ubicación nueva llama al constructor si el puntero pasado es nulo? * –