Когда все размеры известны на этапе компиляции, используй статическое выделение памяти:
Fred matrix[nrows][ncols];
for (unsigned i = 0; i < nrows; ++i) {
for (unsigned j = 0; j < ncols; ++j) {
someFunction(matrix[i][j]);
}
}
Этот подход не требует явной очистки и является самым безопасным вариантом.
Когда размеры определяются во время выполнения, но матрица прямоугольная, выделяй один непрерывный блок с помощью new:
Fred* matrix = new Fred[nrows * ncols];
// Обращение к элементу (i,j): matrix[i*ncols + j]
Важно: Всегда используй обработку исключений, чтобы гарантировать вызов delete[]:
try-catch для предотвращения утечек памятиdelete[] matrix на всех путях выхода (ранний выход, исключения и обычное завершение)Когда строки имеют разные длины, выделяй каждую строку отдельно:
FredPtr* matrix = new FredPtr[nrows];
for (unsigned i = 0; i < nrows; ++i) {
matrix[i] = new Fred[ncols[i]];
}
Удаление должно происходить в обратном порядке:
for (unsigned i = nrows; i > 0; --i) {
delete[] matrix[i-1];
}
delete[] matrix;
Примечание: Используй matrix[i-1] вместо matrix[--i], чтобы избежать переполнения беззнакового целого числа.
Избегай сырых указателей. Оборачивай динамическую память в класс-обёртку или используй контейнеры стандартной библиотеки, такие как std::vector<std::vector<Fred>>. Это обеспечивает автоматическое управление памятью и значительно снижает риск утечек памяти.
Когда все размеры массива известны на этапе компиляции, статическое выделение памяти следует предпочесть динамическому выделению с помощью new, потому что оно не требует явной очистки и безопаснее.
Новый — ещё не проверен сообществом
Вы