1

当我运行下面的代码时,在循环的第二次迭代中,整个操作系统都会挂起。如果我打开任务管理器,它清楚地表明存在巨大的内存泄漏。在我开始执行代码后,所有内存在 4 秒内就消失了。

这是代码:

void matrix_vector_multiplication_comparison()
{    
    for (unsigned DIMS_SIZE = 64; DIMS_SIZE <= 2048; DIMS_SIZE += 64)
    {

        __declspec(align(16))float* m1 = generate_random_1d_matrix(DIMS_SIZE * DIMS_SIZE);
        __declspec(align(16))float* m2 = generate_random_1d_matrix(DIMS_SIZE * DIMS_SIZE);
        __declspec(align(16))float* v1 = generate_random_1d_matrix(DIMS_SIZE);
        __declspec(align(32))float* v2 = generate_random_1d_matrix(DIMS_SIZE);
        __declspec(align(16))float* res1 = new float[DIMS_SIZE];
        __declspec(align(16))float* res2 = new float[DIMS_SIZE];
        __declspec(align(32))float* res3 = new float[DIMS_SIZE];


// ........ other stuff here...........

        delete[] m1;
        delete[] m2;
        delete[] v1;
        delete[] v2;
        delete[] res1;
        delete[] res2;
        delete[] res3;
    }
} 

当我注释掉代码中的所有内容并只在循环中留下__declspec(align())声明和delete[]'for时,内存泄漏仍然存在,这表明问题实际上出在那些__declspecs 上。

函数generate_random_1d_matrix,看起来像这样get_random_floatmain

float* generate_random_1d_matrix(unsigned const int dims)
{
    size_t i;
    float* result = new float[dims * dims];
    for (i = 0; i < dims * dims; ++i)
        result[i] = get_random_float(10, 100);
    return result;
}

inline float get_random_float(float min, float max)
{
    float f = (float)rand() / RAND_MAX;
    return min + f * (max - min);
}

int main()
{
    matrix_vector_multiplication_comparison();
    return 0;
}

谁能告诉我这里出了什么问题以及如何解决该内存问题?

更新

更改了提供的代码。我只留下了实际产生问题的部分。

4

2 回答 2

4
delete[] m1, m2, v1, v2, res1, res2, res3;

这并不像你认为的那样。您正在使用逗号运算符,而您可能打算将多个东西传递给delete[]. 您需要自己删除每个变量:

delete[] m1;
delete[] m2;
delete[] v1;
delete[] v2;
delete[] res1;
delete[] res2;
delete[] res3;
于 2015-11-21T20:35:23.863 回答
2

尝试将 2048 降低到更合理的数字。实际上,您正试图在大块中分配数百万个浮点数,这似乎不合理。(实际上可能是几百万)

即使只有 128,您也试图分配 128^4*2 浮点数,超过 2 亿。在我之前的解释中,我有点低调了。甚至 64 也可能接近过高。

我几乎可以肯定,问题是在 generate_random_1d_matrix 中,当您使用 dims*dims 时,您应该只使用 dims。毕竟它是一个一维矩阵。

于 2015-11-21T21:17:24.917 回答