Вызывает ли размещение new конструктор, если переданный указатель равен нулю? - PullRequest
5 голосов
/ 27 октября 2010

Я попытался преобразовать проект vc7.1 в vs2010, который я получил от codeproject. = 50 & шума = 3 & рода = Позиция & вид = Expanded & FR = 1 # xx0xx

Но после преобразования и изменения его конфигурации.

Я нахожу, что это отладка безуспешно, это говорит Необработанное исключение в 0x0028e7b9 в DrawIt.exe: 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;
}

Кто-нибудь получил идею, плз?

Поскольку я не очень хорош в C ++, потребуется некоторое время, прежде чем я пойму, как решить эту проблему. Просто загрузил исходный код исходный файл , было бы полезно, если бы кто-то мог помочь.

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

[Этот ответ может быть неправильным; смотрите комментарии для обсуждения; Я пока оставлю это без ответа, чтобы мы могли выяснить, каков ответ]

Allocate возвращает NULL в нескольких случаях отказа.

Вы не проверяете результат вызова Allocate, прежде чем использовать его.

Вам нужно проверить результат. В качестве альтернативы вы можете выдать исключение при сбое.

2 голосов
/ 27 октября 2010

Ну, ваша Allocate функция явно возвращает NULL. Нам довольно сложно сказать, где и почему, и для вас тривиально установить точки останова и самостоятельно пройти через распределитель, поэтому я предлагаю вам сделать это и выяснить, куда возвращается функция.

...