C++意外的内存错误
C++ unexpected memory error
我对简单的C++程序有问题,该程序可以在给定矩阵中找到最大的子矩阵:
int *A = new int[n*m];
... setting fields for matrix, finding the largest one and etc
... r := size of square-submatrix, max_i := row, max_j := column of the largest
for (i = max_i; i < max_i + r; i++)
{
for (j = max_j; j < max_j + r; j++)
cout << A[i * n + j] << "t";
cout << "n";
}
<memory free>
end of program
一切都很好(所以这不是逻辑问题) - 找到正确的子矩阵,prinitng等。
出乎意料(或由于深夜)当我放入内存空闲行删除[] A 或删除所有内容时都会出现错误(但它仍然正确打印结果 - 所以错误必须在这一行中)。我尝试将其设置为 NULL 和每个组合。出了什么问题?
提前致谢
编辑:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i,j,k;
int m,n;
int r;
cout << "Size of matrix: nRows: ";
cin >> n;
cout << "Columns: ";
cin >> m;
int *A = new int[n*m];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
A[n*i + j] = rand() % 19 - 9;
cout << A[n*i + j] << "t";
}
cout << "n";
}
cout << "Size of submatrix: ";
cin >> r;
int liczba_kwadratow = (m + 1 -r) * (n+1 -r);
int max = -10000;
int max_i = 0;
int max_j = 0;
int row_iter = 0;
int col_iter = 0;
for (k = 0; k <liczba_kwadratow; k++)
{
int sum = 0;
for ( i = row_iter; i < row_iter + r; i++)
for ( j = col_iter; j < col_iter + r; j++)
sum += A[i * n + j];
if ( sum > max )
{
max = sum;
max_i = row_iter;
max_j = col_iter;
}
col_iter++;
if ( row_iter + r > m )
{
row_iter++;
col_iter = 0;
}
}
cout << "Field of the largest submatrix " << r << " of " << r << " equals " << max << "n";
for (i = max_i; i < max_i + r; i++)
{
for (j = max_j; j < max_j + r; j++)
cout << A[i * n + j] << "t";
cout << "n";
}
...works great without delete[] A or delete A
}
这个问题至少可以通过我在评论中告诉您的方法(或使用调试器)来识别。最简单的方法是将动态数组更改为std::vector
然后使用成员函数at
。然后,您将意识到您在此处抛出了一个越界异常:
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
A.at(n*i + j) = rand() % 19 - 9; // throws here!!!!, replace n by m
cout << A.at(n*i + j) << "t";
}
cout << "n";
}
当输入为 6 5 3 时,当您第一次尝试访问 A[30]
时会出现异常,这让您在delete[]
时头疼。现在你可以弄清楚我猜出了什么问题了......
你在矩阵访问代码中反转了 i 和 j。
基本上公式可以是
current row + current column * number of rows
或
current row * number of columns + current column
关于代码和调试的两个说明:
使用单字母变量可最大程度地减少键盘和手指的磨损,并减少磁盘和内存的使用。但是,它往往会大大增加调试时间。
仅仅因为它不会立即崩溃而认为代码正常是绝对错误的。C/C++ 是未定义行为的领域(在您的情况下,可能是最常见的行为:在分配的内存之外写入)。UB 是一项令人讨厌的工作,正是因为它可以产生任何结果,包括(经常)明显没有后果,只是导致完全正常的代码在 10.000 行后崩溃。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 共享内存:MapViewOfFile 返回错误 5
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 释放动态内存时C++错误
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 复制内存给出分段错误
- C++程序错误:malloc():内存损坏
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 为什么删除分配的阵列会导致内存错误?
- 需要找到3个小错误-内存错误
- 错误:内存位置的 std::length_error
- 修复了瓦尔格林德错误内存泄漏的错误
- 错误:“内存集”未在此范围内声明
- OpenCV 2.4.5运行时错误内存
- OpenCV错误:内存不足
- STL映射,设置错误:内存超出分配块的末尾
- GLUT:致命错误:内存不足
- MPI错误:内存不足-有哪些解决方案选项