簡體   English   中英

“圍繞變量 'b' 的堆棧已損壞。” (沒有堆分配)

[英]“Stack around the variable 'b' was corrupted.” (No heap allocations)

所以我有一個簡單的矩陣 class,當我將它記錄到控制台時一切都很好,但是當程序終止時會出現問題。

我沒有分配任何堆memory,它只是一個簡單的模板class,可以將矩陣記錄到控制台。 (不過,我計划添加加法、減法和乘法。)

#include <iostream>

using std::cout, std::cin, std::ostream;

template<typename T = float, int R = 4, int C = R>
class Matrix {
public:
    Matrix(T identity = T{}) {
        for (int i = 0; i < R; ++i)
            for (int j = 0; j < C; ++j)
                matrix[i][j] = T{};

        for (int i = 0; i < R; ++i)
            matrix[i][i] = identity;
    }

    T& operator()(int row, int column = 0) {
        if (C == 1)
            return matrix[(row < R&& row > -1 ? row : 0)][0];
        else
            return matrix[(row < R&& row > -1 ? row : 0)][(column < R&& column > -1 ? column : 0)];
    }

    const T& operator()(int row, int column = 0) const {
        if (C == 1)
            return matrix[(row < R&& row > -1 ? row : 0)][0];
        else
            return matrix[(row < R&& row > -1 ? row : 0)][(column < R&& column > -1 ? column : 0)];
    }

    T* ToArray() {
        return reinterpret_cast<T*>(matrix);
    }

    const T* ToArray() const {
        return reinterpret_cast<const T* const>(matrix);
    }
private:
    T matrix[R][C];
};

template<typename T, int R = 4, int C = 0>
ostream& operator<<(ostream& stream, const Matrix<T, R, C>& matrix) {

    const T* matrixArray = matrix.ToArray();
    
    for (int i = 0; i < R; ++i) {
        for (int j = 0; j < C; ++j) {
            stream << (j == 0 ? '[' : ' ');
            stream << matrix(i, j);
            stream << (j == C - 1 ? ']' : ' ');
        }
        stream << (i == R - 1 ? '\0' : '\n');
    }

    return stream;
}

int main() {

    Matrix a(1.0f);
    Matrix<float, 4, 1> b(1.0f);

    cout << a << '\n';
    // no error occurs when I do this
    //cout << b(1, 0) << '\n';
    cout << b << '\n';

    /* OUTPUT
    [1  0  0  0]
    [0  1  0  0]
    [0  0  1  0]
    [0  0  0  1]
    [1]
    [0]
    [1]
    [0]
    */

    cin.get();
    // when the error occurs
}

問題是這個循環(感謝dxiv

    for (int i = 0; i < R; ++i)
        matrix[i][i] = identity;

當 R > C 時訪問數組越界,您應該消除該循環並修改之前的(假設在代碼中始終使用標識填充對角線的邏輯是正確的):

    for (int i = 0; i < R; ++i)
        for (int j = 0; j < C; ++j)
            matrix[i][j] = i == j ? identity : T{};

也在這段代碼中:

 return matrix[(row < R&& row > -1 ? row : 0)][(column < R&& column > -1 ? column : 0)];

您將columnR進行比較,但您應該與C進行比較,看起來這就是您分別處理案例C==1的原因。 只要解決這個問題,你就不再需要那個條件了。

注意:當您將數組reinterpret_cast為指針時,我看不到方法的使用,但很可能您在這里做錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM