首页 > 解决方案 > 向量操作中的双重释放或损坏(输出)错误(C++)

问题描述

当我运行以下代码时,它会 double free or corruption (out) Aborted (core dumped)出错。我尝试调试,但我仍然不明白这段代码不起作用的原因。我尝试搜索类似的错误,但其中大多数处理原始指针和错误的内存分配,但似乎并非如此。

#include <vector>
#include <algorithm>
#include <cmath>

float median(std::vector<float> array){
    std::sort(array.begin(), array.end());
    std::size_t length = array.size();
    if (length % 2 != 0){
        return array[(length - 1)/2];
    }
    float median = (array[length/2 - 1] + array[length/2]) / 2.0;
    return median;
}

int main(int argc, char const *argv[])
{
    const int DIM = 32;
    const int AUX_COLS = 4;
    std::vector<float> weights(DIM * AUX_COLS);
    for (std::size_t j = 0; j < AUX_COLS; j++) {
        std::vector<float> column(DIM);
        for (std::size_t i = 0; i < DIM; i++) {
            column[i] = i * i + j * j;
        }
        float colMedian = median(column);
        for (std::size_t i = 0; i < DIM; i++) {
            weights[i * DIM + j] = std::abs(1.0f);
        }
    }
    return 0;
}

标签: c++vectorallocation

解决方案


weights[i * DIM + j] = std::abs(1.0f); 这是错误的,因为

DIM*(DIM-1)+(AUX_COLS-1) > DIM * AUX_COLS == weights.size()

您可以通过注释掉程序的某些部分来找到此错误。当它运行时没有错误时,这表明该错误位于您注释掉的部分(或由于您的注释而未运行的代码中)的某处。


推荐阅读