van una tecnicas señales saber roben robar quieren que puedo para nada metieron llevaron hacer evitar entraron den cuenta como casas casa c++ visual-studio-2010 mfc stl atl

c++ - una - señales de que te van a robar



¿Nueva ubicación llama al constructor si el puntero pasado es nulo? (2)

Traté de 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 & noise = 3 & sort = Posición y vista = Expandido & fr = 1 # xx0xx

Pero después de convertir y modificar su configuración.

Lo encuentro depurar sin éxito, 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 va 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, por favor?

Como no soy bueno en C ++, tomará un tiempo antes de descubrir cómo resolver este problema. Acabo de subir el archivo fuente del código fuente , se agradecería si alguien pudiera ayudarlo.


Bueno, su función Allocate claramente está devolviendo NULL . Es bastante difícil para nosotros decir dónde y por qué, y es trivial para usted establecer puntos de interrupción y recorrer el asignador usted mismo, por lo que le sugiero que haga eso y descubra dónde devuelve la función.


[Esta respuesta puede estar equivocada; ver los comentarios para discusión; Voy a dejar esto sin recuperar por el momento para que podamos averiguar cuál es la respuesta]

Allocate devuelve NULL en varios casos de falla.

No verifica el resultado de llamar Allocate antes de usarlo.

Debe verificar el resultado. Alternativamente, puede lanzar una excepción cuando tiene una falla.