ответ должен быть легким.Но я не могу быть уверен, потому что вы дали недостаточно информации о вашем компиляторе, языке и вашем оборудовании.И самое главное, я не вижу вопроса.
Но мы предполагаем, что вы хотите знать, почему ваша рутина терпит неудачу.
Далее.Я не был уверен, какой язык вы используете.Это похоже на обычный старый C, но по какой-то причине вы использовали ключевое слово auto и static_cast в комментарии.Итак, это «должен» быть C ++.
Сначала ответ, затем несколько дополнительных комментариев:
Вы пытаетесь выделить 19 ГБ в куче.В зависимости от используемой вами модели памяти и наличия физической памяти, это может произойти сбой.
Кроме того, вы пишете
int i = col + row * n_cols;
Это создаст переполнение.
Второе: некоторые предложения по улучшению.
Если вы используете современный C ++, вам следует использовать современный C ++.Звучит странно, но ваш код выполнен в стиле C.
Если вы действительно хотите обрабатывать большие данные, вы можете рассмотреть базу данных.Но я сомневаюсь, что вам действительно нужно 19 ГБ заполненных данных.Существуют и другие методы хранения только необходимых данных.Вы должны изменить свой алгоритм.
Я прокомментировал ваш код, чтобы дать хотя бы несколько предложений по улучшению:
// Rows and Cols could be made const. They are not modified in your code
// If you anyway later cast to long long, then you could also make the parameters long long
// You should use unique_ptr to take ownership of the allocated memory
// But this cannot be copied and needs to be "moved" out of the function
// You should use a C++ container to hold your matrix, like a std::vector
double* create_matrix_1d(int n_rows, int n_cols) {
// You should not use C-Style Cast but static_cast
long long len = (long long ) n_rows * (long long) n_cols;
// You should use a unique_ptr to handle the resource
auto* A = new double[len];
int row, col ;
for(row = 0; row < n_rows; row++) {
for( col = 0; col < n_cols; col++) {
// The "int i" can most likely hold only (2^32-1)
// SO you will get an overfolow here
int i = col + row * n_cols;
// You wanted to assign an int to a double
A[i] = 1; //static_cast <int> (rand()) % 10 ;
}
}
return A;
}
Надеюсь, это поможет