"Stack around the variable 'b' was corrupted."(无堆分配)



所以我有一个简单的矩阵类,当我将它记录到控制台时,一切都很好,但当程序终止时就会出现问题。

我没有分配任何堆内存,它只是一个简单的模板类,可以将矩阵记录到控制台。(不过我计划加加法、减法和乘法。(

#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 ? '' : '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指向指针时,我看不到方法的用法,但很可能您在这里做错了什么。

最新更新