Если вы запустите программу под Valgrind, она точно скажет вам, что не так:
==6939== Invalid read of size 8
==6939== at 0x1092C9: input_matrix(int, int) (53083248.cpp:30)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939== Address 0x4d7ecc0 is 0 bytes inside a block of size 16 free'd
==6939== at 0x48373EB: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6939== by 0x109296: input_matrix(int, int) (53083248.cpp:23)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939== Block was alloc'd at
==6939== at 0x483654F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6939== by 0x1091D3: input_matrix(int, int) (53083248.cpp:14)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939==
==6939== Invalid write of size 4
==6939== at 0x496FFF0: std::istream::operator>>(int&) (istream.tcc:194)
==6939== by 0x1092EA: input_matrix(int, int) (53083248.cpp:30)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939== Address 0x4d7ed10 is 0 bytes inside a block of size 8 free'd
==6939== at 0x48373EB: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6939== by 0x10927D: input_matrix(int, int) (53083248.cpp:22)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939== Block was alloc'd at
==6939== at 0x483654F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6939== by 0x10922A: input_matrix(int, int) (53083248.cpp:18)
==6939== by 0x1093FA: main (53083248.cpp:59)
==6939==
==6939== Invalid read of size 8
==6939== at 0x10934D: print_matrix(int**) (53083248.cpp:42)
==6939== by 0x10940C: main (53083248.cpp:60)
==6939== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==6939==
==6939==
==6939== Process terminating with default action of signal 11 (SIGSEGV)
==6939== Access not within mapped region at address 0x0
==6939== at 0x10934D: print_matrix(int**) (53083248.cpp:42)
==6939== by 0x10940C: main (53083248.cpp:60)
Существует и чтение и запись в память, которая была освобождена, и разыменование dynamicArray
, которое никогда не назначалось.
Чтобы исправить это, вам нужно убедиться, что время жизни вашей памяти соответствует тому, когда вы их используете, и избегать затенения dynamicArray
в пределах input_matrix()
.
Я советую вам избегать необработанных new[]
и delete[]
- предпочитайте использовать контейнеры и умные указатели, которые владеют ресурсами для вас, и автоматически освобождать их от своих деструкторов.