C ++ возвращает указатель указывает на что-то отличное от того, что было возвращено из функции - PullRequest
1 голос
/ 08 декабря 2010

В следующем коде в моей программе (упрощенно, конечно) выходные данные в funcA и funcB различаются, что означает, что значение указателя было изменено где-то по пути.Я не смог подтвердить, что адрес face изменился, так как эта ошибка волшебным образом не появляется в отладчике (отладчик QT Creator).Но вот код:

void funcA() {
    Face *face = funcB();

    if (face != NULL) {
        cout << "in funcA " << face->vertices[0] << endl;
    }
}

Face * funcB() {
    vector<Face> faces;
    //populate faces
    ...

    Face *face = &(faces[index]);
    cout << "in funcB " << face->vertices[0] << endl;
    return face;
}

Хотя вывод меняется в зависимости от того, где щелкает моя мышь, вывод в двух функциях выше сильно отличается (в funcB это будет, например, 30, а в funcA это станет18117600 ... У меня всего 60 лиц!) Кроме того, кажется, что он появляется случайно, а не постоянно.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Вы возвращаете указатель на локальное значение, которое больше не существует после возврата.

5 голосов
/ 08 декабря 2010

Прежде всего использование raw указателей с контейнерами STL может быть опасным.

vector<Face> faces; локально для funcB(), поэтому после возврата из функции она уничтожается и остается с свисающий указатель (который когда-то указывал на действительное локальное значение). При использовании висячий указатель вызывает Неопределенное поведение .

3 голосов
/ 08 декабря 2010

Вы возвращаете адрес локальной переменной faces[index], которая недействительна после возврата funcB. Объекты в векторе faces удаляются, как только завершается funcB, и вы возвращаете адрес объекта, который был удален. Это вызовет неопределенное поведение.

...