【发布时间】:2017-10-24 17:13:52
【问题描述】:
我创建了一个名为vector3D 的类,它具有x、y 和z,以及一些用于操作此向量的函数:
class vector3D {
float x, y, z;
public:
vector3D();
vector3D(float);
vector3D(float, float, float);
vector3D(vector3D& v);
float get_x();
float get_y();
float get_z();
vector3D sum_vec_3D(vector3D);
};
vector3D::vector3D() {
x = 0;
y = 0;
z = 0;
}
vector3D::vector3D(float c) {
x = c;
y = c;
z = c;
}
vector3D::vector3D(float cx, float cy, float cz) {
x = cx;
y = cy;
z = cz;
}
vector3D::vector3D(vector3D& v) {
x = v.x;
y = v.y;
z = v.z;
}
vector3D vector3D::sum_vec_3D(vector3D b) {
return vector3D(x + b.x, y + b.y, z + b.z);
}
float vector3D::get_x() {
return x;
}
float vector3D::get_y() {
return y;
}
float vector3D::get_z() {
return z;
}
}
然后我有一个类 matrix4,它创建了 4x4 矩阵。它有一个指针,每次我创建一个矩阵时我都会分配空间(可能错误在这个类中,但我不知道在哪里):
class matrix4 {
public:
float * data;
public:
matrix4();
matrix4(float);
matrix4(float, float, float, float,
float, float, float, float,
float, float, float, float,
float, float, float, float);
matrix4(matrix4& m);
~matrix4();
};
matrix4::~matrix4()
{
delete [] data;
}
matrix4::matrix4() {
data = new float[16];
for (int i = 0; i < 16; i++) {
data[i] = 0;
}
}
matrix4::matrix4(float c) {
data = new float[16];
for (int i = 0; i < 16; i++) {
data[i] = c;
}
}
matrix4::matrix4(float c0, float c1, float c2, float c3, float c4, float c5, float c6, float c7, float c8, float c9, float c10, float c11, float c12, float c13, float c14, float c15) {
data = new float[16];
float input_vector[16] = { c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15 };
for (int i = 0; i < 16; i++) {
data[i] = input_vector[i];
}
}
matrix4::matrix4(matrix4& m) {
data = new float[16];
for (int i = 0; i < 16; i++)
data[i] = m.get_data(i);
}
现在我创建了一个类factory,它可以生成4x4 的特殊矩阵。我创建了这个示例来说明错误:
class factory {
public:
matrix4 createSpecial(vector3D eye, vector3D center);
};
matrix4 factory::createSpecial(vector3D a, vector3D b) {
vector3D c = a.sum_vec_3D(b);
return matrix4(c.get_x(), 0, 0, 0,
0, c.get_y(), 0, 0,
0, 0, c.get_z(), 0,
0, 0, 0, 1);
};
这个函数接收两个向量,创建第三个向量,然后返回一个matrix4,结果值在对角线上。当我运行此函数时,我收到错误消息:
围绕变量“c”的堆栈已损坏
【问题讨论】:
-
可能是没有提供适当的复制ctors的问题。请参阅 3、5 或零规则。
-
我建议你关注the rule of zero,不要自己手动管理内存。使用例如
std::array代替matrix4::data成员。 -
更改对 const 的引用,它将解决您的问题,但最好使用
std::array -
@Slava “参考”是什么意思?
-
在上面编写程序时,您应该了解该语言的基础知识:en.wikipedia.org/wiki/Reference_(C%2B%2B)
标签: c++ stack-corruption