【问题标题】:Stack around the variable 'c' was corrupted [closed]变量'c'周围的堆栈已损坏[关闭]
【发布时间】:2017-10-24 17:13:52
【问题描述】:

我创建了一个名为vector3D 的类,它具有xyz,以及一些用于操作此向量的函数:

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


【解决方案1】:

问题在于你的“复制”构造函数matrix4(matrix4&amp; m)

它的问题是return matrix4(...);创建了一个临时对象,而临时对象不能绑定到非常量引用。换句话说,您的“复制”构造函数没有被调用,导致多个对象具有相同的data 指针。

解决办法是创建一个合适的拷贝构造函数matrix4(const matrix4&amp; m)

或者,正如我在评论中提到的,根本不要进行手动内存管理,并在不需要复制构造函数或析构函数的情况下使用零规则。

【讨论】:

  • 我改变了我的复制构造器,就像这样正确知道:matrix4::matrix4(const matrix4&amp; m) { data = new float[16]; for (int i = 0; i &lt; 16; i++) data[i] = m.data[i]; },但错误并没有消失......
  • @BernardoBacalhau 那么您可能应该尝试使用 debugger 来定位您写入越界的位置。取决于平台Valgrind 是可用于此类目的的内存调试器。
猜你喜欢
  • 2012-11-08
  • 2012-11-05
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2019-09-04
相关资源
最近更新 更多