引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
Exception thrown: read access violation. **dynamicArray** was 0x1118235. occurred
#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。发生
我该怎么办?
提前谢谢。
您的程序存在多个问题。让我逐一列出它们。
- 正如其中一条评论中所提到的,您立即在分配内存后立即释放内存。当然是这样当您访问了已释放的内存
- 当你分配内存时,你没有将分配的内存指针分配给全局指针
dynamicArray
,而是使用函数CCD_ 2内的相同名称。作为此指针变量作用域结束于正在丢失内存的函数内已分配。因此,你将再次面临分割故障或记忆CCD_ 3函数内部的访问违规 - 在循环内部的
print_matrix
函数中,您正在检查m==COLUMNS
是否打印新行,这永远不会发生,因为m总是小于COLUMNS
- 最后,正如前面的答案所建议的那样,当您使用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[]
——更喜欢使用为您拥有资源的容器和智能指针,并自动将其从其析构函数中释放。
相关文章:
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 0x%08lx 格式说明符在 printf 语句到 cout
- 在 C++ Builder 中使用 NULL 构造 DynamicArray
- 如何使系统在十六进制数之前打印 0x,在八进制数之前打印 0?
- -std=c++0x 导致在 boost 1.64 的情况下返回对临时的引用
- 将字符串转换为十六进制格式并将"0x "附加到十六进制值
- 使用 C++0x 编译生成文件
- 如何将 x 打印为 0x,其中 x 是整数C++
- Unix 宏在使用 -std=c++0x 标志编译时变得未定义
- 嵌套模板功能中的C 0x lambda参数
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- G-WAN cc1plus:错误:无法识别的命令行选项"-std=gnu++0x"
- 在 DirectXGame.exe 中0x00B84CD6出现未经处理的异常:0xC0000005:访问冲突读取位置0x
- C++0x线程没有加速
- 如何为 C++0x/11 和非 C++0x/11 制作标头
- Compiling c++0x for AVR
- C++中的 0x 和"\x"有什么区别?
- 小写 0x 与大写 iostream
- g++-std=c++0x及其兼容性