无法在循环中动态分配内存(一个函数吃掉所有内存)
Cannot allocate memory dynamically in loop (a function eats all the memory)
当我 运行 下面的代码时,在循环的第二次迭代中整个 OS 挂起。如果我打开任务管理器,它清楚地显示存在巨大的内存泄漏。我开始执行代码后,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;
}
谁能告诉我这里出了什么问题以及如何解决内存问题?
更新
更改了提供的代码。我只留下了实际产生问题的部分。
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;
尝试将 2048 降低到更合理的数字。事实上,您正试图在大块中分配数百万个浮点数,这似乎不合理。 (实际上可能是几百万)
即使只有 128,您也在尝试分配 128^4*2 个浮点数,即超过 2 亿。我在之前的解释中有点低估了。即使是 64 也可能接近太高了。
我几乎可以肯定,问题是在 generate_random_1d_matrix 中,当您使用 dims*dims 时,您应该只使用 dims。毕竟是一维矩阵。
当我 运行 下面的代码时,在循环的第二次迭代中整个 OS 挂起。如果我打开任务管理器,它清楚地显示存在巨大的内存泄漏。我开始执行代码后,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;
}
谁能告诉我这里出了什么问题以及如何解决内存问题?
更新
更改了提供的代码。我只留下了实际产生问题的部分。
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;
尝试将 2048 降低到更合理的数字。事实上,您正试图在大块中分配数百万个浮点数,这似乎不合理。 (实际上可能是几百万)
即使只有 128,您也在尝试分配 128^4*2 个浮点数,即超过 2 亿。我在之前的解释中有点低估了。即使是 64 也可能接近太高了。
我几乎可以肯定,问题是在 generate_random_1d_matrix 中,当您使用 dims*dims 时,您应该只使用 dims。毕竟是一维矩阵。