Вектор-член объектов (не указателей) становится «не установленным» после того, как указатель на (глобальный / постоянный) объект выходит из области видимости - PullRequest
0 голосов
/ 27 октября 2011

Кто-нибудь, пожалуйста, взгляните на следующие фрагменты кода (все из одного файла) и порекомендуете проблему, которую я опишу в конце?

члены:

    std::vector<cHasAMyClass>   collected;
    std::vector<cHasACHasAMyClass>  memberVector;//Actually an array of vectors, but simpler not to be.

конструкторвнутреннего / локального класса:

    cHasACHasAMyClass(cHasAMyClass *ptrToCHasAMyC, int stuff) :
                masterRef(ptrToCHasAMyC),
                other_stuff(stuff) {}

метод, который я использовал:

cHasAMyClass *firstUniqueOccurrence(std::vector<cHasAMyClass> *masterList, myClass *qSq) {
    for (int i = 0; i < (int)masterList->size(); ++i)
        if ((*masterList)[i].myClassPtr == qSq) return &((*masterList)[i]);
    masterList->push_back(cHasAMyClass(qSq));
    return &(masterList->back());
}

блок, который вызывает метод выше:

{
    std::vector<myClass *> allAtLoc;
    if (map->getAllHere(curLoc, &allAtLoc)) {
        for (int i = 0; i < (int)allAtLoc.size(); ++i) {
            int stuff = 42; //Or otherwise
            cHasAMyClass *newContainer = firstUniqueOccurrence(&(collected), allAtLoc[i]);
            memberVector.push_back(cHasACHasAMyClass(newContainer, stuff));
        }
    }
    allAtLoc.clear();
}

Проблема немного позже (Хорошо, сразу после выхода из вышеуказанного блока) memberVector[0].masterRef кажется испорченным, что я обнаруживаю (кроме сбоя), потому что его член типа myClass недействителен или пуст.Я думал, что установил указатель на постоянный объект (управляемый в другой структуре данных, простой массив (/ ptr - это new / malloc 'd)), но я новичок в использовании векторов и не уверен, чтосвоего рода косвенность, свидетелем которой я был.

У меня allAtLoc и newContainer выходят из области видимости, и хотя они всего лишь указатели на объекты, у них есть побочные эффекты.Кстати, мой collected вектор не содержит ошибок.

До того, как я перешел на std::vector s, все работало нормально, я не понимаю, как неверно мое перенаправление, пожалуйста, кто-нибудь может посоветовать

1 Ответ

1 голос
/ 27 октября 2011

Трудно читать ваш код, но похоже, что вы берете указатели на элементы в пределах vector. Указатели, итераторы и ссылки на vector становятся недействительными при изменении его емкости. Это может произойти как побочный эффект любой функции, которая вставляется в vector, поскольку создается новый больший внутренний массив, в который копируется текущее содержимое.

Если вы хотите использовать указатели на элементы в vector, вы должны убедиться, что они не будут признаны недействительными. Если вы знаете количество элементов, вы можете позвонить reserve до того, как вставить какие-либо элементы.

...