[英]“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)];
您將column
與R
進行比較,但您應該與C
進行比較,看起來這就是您分別處理案例C==1
的原因。 只要解決這個問題,你就不再需要那個條件了。
注意:當您將數組reinterpret_cast
為指針時,我看不到方法的使用,但很可能您在這里做錯了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.