引发异常:读取访问冲突**dynamicArray**为0x1118235.发生

Exception thrown: read access violation. **dynamicArray** was 0x1118235. occurred

本文关键字:dynamicArray 0x1118235 发生 访问冲突 异常 读取      更新时间:2023-10-16
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int **dynamicArray ;
int ROWS, COLUMNS;
//---------------------------------
int input_matrix(int ROWS, int COLUMNS)
{
//---------------------------------------
//memory allocated for elements of rows.
int **dynamicArray = new int *[ROWS];
//memory allocated for  elements of each column.
for (int i = 0; i < ROWS; i++)
dynamicArray[i] = new int [COLUMNS];
//free the allocated memory
for (int i = 0; i < ROWS; i++)
delete[] dynamicArray[i];
delete[] dynamicArray;
//-------------------------------------
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLUMNS; j++)
{
cin >> dynamicArray[i][j];
}
}
return 0;
}
//---------------------------------------------
int print_matrix(int **Array)
{
for (int k = 0; k < ROWS; k++)
{
for (int m = 0; m < COLUMNS; m++)
{
cout << Array[k][m];
if (m == COLUMNS)
{
cout << "n";
}
}
}
return 0;
}
//---------------------------------
int main()
{
cin >> ROWS;
cin >> COLUMNS;
input_matrix(ROWS, COLUMNS);
print_matrix(dynamicArray);
}

这段代码定义了一个矩阵,并获得输入,并将其放入矩阵的成员中,但每次我运行这段代码时,我都会在以下行中收到读取访问违规错误:

cin >> dynamicArray[i][j];

以下是完整的详细信息:引发异常:读取访问冲突。dynamicArray为0x1118235。发生

我该怎么办?

提前谢谢。

您的程序存在多个问题。让我逐一列出它们。

  1. 正如其中一条评论中所提到的,您立即在分配内存后立即释放内存。当然是这样当您访问了已释放的内存
  2. 当你分配内存时,你没有将分配的内存指针分配给全局指针dynamicArray,而是使用函数CCD_ 2内的相同名称。作为此指针变量作用域结束于正在丢失内存的函数内已分配。因此,你将再次面临分割故障或记忆CCD_ 3函数内部的访问违规
  3. 在循环内部的print_matrix函数中,您正在检查m==COLUMNS是否打印新行,这永远不会发生,因为m总是小于COLUMNS
  4. 最后,正如前面的答案所建议的那样,当您使用C++时,使用带有智能指针的向量比使用数组和原始指针更好,可以更好地管理内存

下面的代码段解决了这些问题。

#include <iostream>
#include <string>
using namespace std;
int **dynamicArray ;
int ROWS, COLUMNS;
//---------------------------------
int input_matrix(int ROWS, int COLUMNS)
{
//---------------------------------------
//memory allocated for elements of rows.
dynamicArray = new int *[ROWS];
//memory allocated for  elements of each column.
for (int i = 0; i < ROWS; i++)
dynamicArray[i] = new int [COLUMNS];
//    cout<<"Input array valuesn";
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLUMNS; j++)
{
cin>>dynamicArray[i][j];
}
}
return 0;
}
void free_matrix_memory()
{
cout<<"freeing allocated memoryn";
//free the allocated memory
for (int i = 0; i < ROWS; i++)
delete[] dynamicArray[i];
delete[] dynamicArray;
//-------------------------------------
}
//---------------------------------------------
int print_matrix(int **Array)
{
cout<<"printing matrixn";
for (int k = 0; k < ROWS; k++)
{
for (int m = 0; m < COLUMNS; m++)
cout << Array[k][m];
cout << "n";
}
return 0;
}
//---------------------------------
int main()
{
cout<<"Row and column valuesn";
cin>> ROWS;
cin>> COLUMNS;
input_matrix(ROWS, COLUMNS);
print_matrix(dynamicArray);
free_matrix_memory();
}

仍然可以为您做许多改进,例如避免全局变量等,我将由您来做这些改进。

在这种情况下,没有理由手动滚动内存管理。使用std::vector(它是一个动态数组(,甚至使用实际的矩阵库,例如"Eigen"。

如果您在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的取消引用也从未分配。

要解决这些问题,您需要确保您的内存寿命适合使用它们,并避免在input_matrix()中隐藏dynamicArray

我建议您避免使用原始的new[]delete[]——更喜欢使用为您拥有资源的容器和智能指针,并自动将其从其析构函数中释放。