【问题标题】:malloc.c:2451 in a program using an std::vector of vectorsmalloc.c:2451 在使用向量的 std::vector 的程序中
【发布时间】:2013-05-22 05:52:09
【问题描述】:

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

1) 将所有向量增加一行,值 0.0

2) 在末尾添加一个新向量,所有元素都为 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 语句。这些仅用于查找错误。 该程序恰好在三个迭代中执行良好。 (所以上面的代码工作了三次)。在第四次迭代中,程序在 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 双精度矩阵的空间需求不足以占用所有可用内存。我在其他地方读到我应该使用 Valgrind 来解决这个问题,但这超出了我的能力。

【问题讨论】:

    标签: c++ vector matrix crash malloc


    【解决方案1】:

    发布的代码不足,无法确定问题所在。但是,下面的说法是可疑的:

    s_mat[l_].push_back(0.0);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多