当我运行下面的代码时,在循环的第二次迭代中,整个操作系统挂起。如果我打开任务管理器,它会清楚地表明存在巨大的内存泄漏。在我开始执行代码之后,所有内存都在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
时,内存泄漏仍然存在并显示问题实际上是那些__declspec
。
函数generate_random_1d_matrix
,get_random_float
和main
如下所示:
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;
}
有人能告诉我这里出了什么问题以及如何解决这个记忆问题吗?
更改了提供的代码。我只留下了实际产生问题的部分。
答案 0 :(得分:4)
delete[] m1, m2, v1, v2, res1, res2, res3;
这不符合你的想法。您正在使用comma operator,而您可能想将多个内容传递给delete[]
。您需要删除它自己的所有变量:
delete[] m1;
delete[] m2;
delete[] v1;
delete[] v2;
delete[] res1;
delete[] res2;
delete[] res3;
答案 1 :(得分:2)
尝试将2048降低到更合理的数字。因为它是你试图在大块中分配数百万个花车,这看起来并不合理。 (它可能实际上是数百万)
即使只有128,你也试图分配128 ^ 4 * 2个浮点数,超过2亿。我在之前的解释中略微低调。甚至64可能接近太高。
我几乎肯定问题是,在使用dims * dims的generate_random_1d_matrix中,你应该只使用dims。毕竟它是一个1d矩阵。