Не удается выделить память динамически в цикле (функция съедает всю память)

Когда я запускаю приведенный ниже код, на второй итерации цикла зависает вся ОС. Если я открою диспетчер задач, он ясно покажет, что произошла огромная утечка памяти. После того, как я начал выполнение кода, вся память исчезла за 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_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;
}

Может кто-нибудь сказать мне, что здесь происходит не так и как решить эту проблему с памятью?

изменил предоставленный код. Я оставил только те части, которые действительно создают проблему.

1

Решение

Попробуйте понизить 2048 до более разумного числа. Так как вы пытаетесь разместить миллионы поплавков в больших блоках, что не кажется разумным. (На самом деле это могут быть десятки миллионов)

Даже на 128 вы пытаетесь выделить 128 ^ 4 * 2 чисел, что превышает 200 миллионов. Я немного расслабился в своем предыдущем объяснении. даже 64, вероятно, приближается слишком высоко.

Я почти уверен, что проблема в том, что в generate_random_1d_matrix, когда вы используете dims * dims, вы должны просто использовать dims. В конце концов, это 1d матрица.

2

Другие решения

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

Это не делает то, что вы думаете, что делает. Вы используете оператор запятой, в то время как вы, вероятно, хотели передать несколько вещей delete[], Вам нужно удалить каждую переменную самостоятельно:

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

По вопросам рекламы [email protected]