c++ - malloc.c:2451 在使用 vector 的 std::vector 的程序中

标签 c++ vector matrix crash malloc

在尝试实现一种查找矩阵特征值的算法时,我遇到了一个问题:程序必须通过连续迭代建立两个辅助矩阵。 (在我的程序中称为 t_mat 和 s_mat)。为此,我决定使用 std::vectors 的 std::vector ,它应该具有相同的长度。 我接下来要做的就是每一步:

1) 所有 vector 增加一行,值为0.0

2) 在末尾添加一个新 vector ,所有元素均为 0.0

代码如下所示:

unsigned j_=0;
while (conv_measure > 0.001){
    (...)
        std::cout << "Step 5" << std::endl;
        unsigned temp_mat_size= t_mat.size();
        std::cout << "CP 1" << std::endl;
        std::cout << "temp mat size " << temp_mat_size << std::endl;
        for (size_t l_=0; l_ < temp_mat_size; l_++)
        {
            t_mat[l_].push_back(0.0); //Enlarge each vector by one row.
            s_mat[l_].push_back(0.0);
        }
        std::cout << "CP 2" << std::endl;
        vec_cont_t next_vec (temp_mat_size+1, 0.0); //matrix_size +1 entries with value 0.0
        std::cout << "CP 3" << std::endl;
        t_mat.push_back(next_vec);
        s_mat.push_back(next_vec);
    (...)
}

请忽略所有 std::cout 语句。这些仅用于查找错误。 该程序在 3 次迭代中表现良好。 (所以上面的代码可以运行三次)。在第四次迭代时,程序在 Eclipse 中崩溃,并显示以下消息:

Band_Lanczos: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

不幸的是,对于 C++,尤其是调试,我仍然是一个初学者。我不明白该消息试图告诉我什么,也不明白为什么程序首先崩溃。我不明白为什么它工作了3次然后突然就下降了。 4x4 double 矩阵的空间要求不足以占用所有可用内存。我在其他地方读到我应该使用 Valgrind 来解决这个问题,但这超出了我的技能范围。

最佳答案

没有发布足够的代码来确定问题所在。然而,以下说法是可疑的:

s_mat[l_].push_back(0.0);

循环假设 s_mat 与 t_mat 大小相同。如果 s_mat 小于 t_mat,那么这将导致未定义的行为。

关于c++ - malloc.c:2451 在使用 vector 的 std::vector 的程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772063/

相关文章:

python - 根据其索引初始化 NumPy 数组

c++ - 在 Armadillo 中将矩阵除以 vector

c++ - 如何使用 C++ 和 Boost Asio 从 HTTP post 请求获取键值

c++ - 使开关繁重的功能更具可重用性

c - 将 vector A 按逆序转置为 B

string - 如何将 Vec<Vec<f64>> 转换为字符串

matlab - 在 Matlab 中生成零和一矩阵的更智能方法

c++ - 如何在使用 Win32 API 创建的窗口上添加淡入/淡出效果

c++ - QSocketNotifier : Socket notifiers cannot be enabled or disabled from another thread

c - 为什么将值写入数组时会出现错误?