Was bedeutet "nicht ausgerichtete Adresse error" bedeuten?

Erste von alle — sorry für die Einzelheiten. Im Allgemeinen versuche ich zu Kochen, meine Fragen zu generic "class A" - Kram nur relevante Sachen, aber ich bin mir nicht sicher, was die Ursache des Problems hier.

Ich habe eine matrix der Klasse Vorlage, die wie folgt aussieht (nur das zeigt, was ich denke, sind die relevanten Teile):

template <std::size_t R, std::size_t C>
class Matrix
{
private:
    //const int rows, cols;
    std::array<std::array<float,C>,R> m;
public:
    inline std::array<float,C>& operator[](const int i)
    {
        return m[i];
    }

    const std::array<float,C> operator[](const int i) const
    {
        return m[i];
    }

    template<std::size_t N>
    Matrix<R,N> operator *(const Matrix<C,N> a) const
    {
        Matrix<R,N> result = Matrix<R,N>();
        //irrelevant calculation
        return result;
    }
    //... other very similar stuff, I'm not sure that it's relevant
}

template <std::size_t S>
Matrix<S,S> identity()
{
    Matrix<S,S> matrix = Matrix<S,S>();

    for(std::size_t x = 0; x < S; x++)
    {
        for(std::size_t y = 0; y < S; y++)
        {
            if (x == y)
            {
                matrix[x][y] = 1.f;
            }
        }
    }

    return matrix;
}

Ich das Gerät getestet für die ganze Klasse, sowohl die Multiplikation und Identität Fabrik zu arbeiten scheinen in Ordnung. Aber dann benutze ich Sie in dieser Methode, die aufgerufen wird, viel mal (ich denke, dass, wenn Sie jemals schrieb einen renderer, es ist ziemlich offensichtlich, was ich versuche zu tun):

Vec3i Renderer::world_to_screen_space(Vec3f v)
{
    Matrix<4,1> vm = v2m(v);
    Matrix<4,4> projection = identity<4>(); //If I change this to Matrix<4,4>(), the error doesn't happen
    projection[3][2] = -1.f;
    vm = projection * vm;
    Vec3f r = m2v(vm);
    return Vec3i(
            (r.x + 1.) * (width / 2.),
            (r.y + 1.) * (height / 2.),
            r.z
        );
}

Und nach einiger Zeit und eine bestimmte Menge von random Aufrufe dieser Methode bekomme ich diese:

Job 1, 'and ./bin/main' terminated by signal SIGBUS (Misaligned address error)

Jedoch, wenn ich die Zeile ändern identity<4>() zu Matrix<4,4>() den Fehler nicht passieren. Ich bin neu bei C++, also muss es etwas wirklich dummes.

So, (1) was bedeutet dieser Fehler bedeutet und (2) wie kam ich zu verwalten, zu Schießen mir in das Bein?

Update: und natürlich diesen Fehler nicht reproduzieren, in der LLDB-debugger.

Update 2: hier ist, was ich bekam, nach dem ausführen des Programms durch Valgrind:

==66525== Invalid read of size 4
==66525==    at 0x1000148D5: Renderer::draw_triangle(Vec3<float>, Vec3<float>, Vec3<float>, Vec2<int>, Vec2<int>, Vec2<int>, Model, float) (in ./bin/main)

Sowie draw_triangle ist genau die Methode, die Anrufe world_to_screen_space und nutzt es aus.

Update 3: ich entdeckte die Quelle des Problems, und es war nicht alles, was im Zusammenhang mit diesem code — und es war etwas, was ziemlich offensichtlich, auch. Wirklich nicht sicher, was zu tun ist, über diese Frage jetzt.

"Falsch Adresse" in der Regel bedeutet, dass Sie eine CPU erfordert eine bestimmte Ausrichtung für bestimmte Daten-Typen (z.B. ein 32-bit-Ganzzahl muss eine 32-bit-ausgerichtet wie Adresse 0x1000 oder 0x1004), und der code ist der Versuch zu verletzen, Anforderung (durch den Versuch zu Lesen, eine 32-bit-integer from-Adresse 0x1001). Sie sind wahrscheinlich mit einigen Guss-oder sonstigen Formen von Typ-Zweideutigkeiten oder schlecht Zeiger-Arithmetik in den code, den Sie noch nicht gezeigt... Oder vielleicht haben Sie eine beschädigte Zeiger... Oder eine von mehreren anderen möglichen Erklärungen...
Wenn es dennoch passiert (ohne debugger), ermöglichen Sie core-dumps, dann prüfen Sie den dump mit einem debugger.
Ich glaube nicht, verwenden Sie Zeiger auf alle in der code — nur Referenzen oder kopieren von Wert.
Das Problem ist wahrscheinlich in Ihrem operator[] Umsetzung
Kürzer, einfacher code ist auch leichter zu bekommen zu korrigieren.

InformationsquelleAutor Max Yankov | 2015-02-25

Schreibe einen Kommentar