内存泄漏在哪里?2d数组类
Where are the memory leaks? 2d array class
我为一个类提交了这个程序,错误消息说有一些内存泄漏,但我找不到(我甚至问了另一位教授)
这是错误消息:
==27796== HEAP SUMMARY:
==27796== in use at exit: 160 bytes in 2 blocks
==27796== total heap usage: 192 allocs, 190 frees, 21,989 bytes allocated
==27796==
==27796== 160 bytes in 2 blocks are definitely lost in loss record 1 of 1
==27796== at 0x402ADFC: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==27796== by 0x804D5C2: SweeperGrid::SweeperGrid(SweeperGrid const&) (in /tmp/grading20151030-8173-zfd6af-0/sweepertest)
==27796== by 0x804BF57: main (sweepertest.cpp:357)
下面是我使用新代码或删除的任何代码:
//显式值构造函数
SweeperGrid::SweeperGrid(const int initialRows, const int initialCols, const int density){
if ((initialRows<5 || initialCols<5) || (density<25 || density>75)) {
throw out_of_range("Grid not large enough (number of rows or columns cannot be fewer than 5) or density is too low or high (must be between 25% and 75%)");
}
numRows = initialRows;
numColumns = initialCols;
numBombs = 0;
grid = new SweeperCell*[numRows];
for(int i=0; i <numRows; i++){
grid[i] = new SweeperCell[numColumns];
}
srand(time(0));
for(int i=0; i<numRows; i++){
for (int j=0; j<numColumns; j++){
if(rand()%100+1<density){
PlaceBomb(i, j);
}
}
}
}
//复制构造函数
SweeperGrid::SweeperGrid(SweeperGrid const & source){
numRows=source.GetRows();
numColumns=source.GetColumns();
numBombs=source.GetBombs();
grid = new SweeperCell * [numRows];
for(int i=0; i < numRows; i++){
grid[i] = new SweeperCell[numColumns];
}
for(int i=0; i<numRows; i++){
for (int j=0; j<numColumns; j++){
grid[i][j] = source.At(i, j);
}
}
}
//自毁
SweeperGrid::~SweeperGrid(){
for(int i=0; i<numRows; i++){
delete [] grid[i];
}
delete [] grid;
}
//功能:过载分配操作员
void SweeperGrid::operator= (SweeperGrid const & source){
numRows=source.GetRows();
numColumns=source.GetColumns();
numBombs=source.GetBombs();
for(int i=0; i<numRows; i++){
delete [] grid[i];
}
delete [] grid;
grid = new SweeperCell * [numRows];
for(int i=0; i < numRows; i++){
grid[i] = new SweeperCell[numColumns];
}
for(int i=0; i<numRows; i++){
for (int j=0; j<numColumns; j++){
grid[i][j] = source.At(i, j);
}
}
}
您的问题是由删除的行数与分配的行数不同引起的:
void SweeperGrid::operator= (SweeperGrid const & source){
numRows=source.GetRows(); // numRows becomes the assigned number of rows here.
// This is a problem, because now you don't remember how many
// rows you need to delete!
numColumns=source.GetColumns();
numBombs=source.GetBombs();
for(int i=0; i<numRows; i++){ // you delete rows here, but the number of rows found in
// the NEW grid, not the old one.
delete [] grid[i];
}
delete [] grid;
...
}
一个简单的解决方案:
void SweeperGrid::operator= (SweeperGrid const & source){
for(int i=0; i<numRows; i++){ // you delete rows here, while you still remember
// how many you should delete
delete [] grid[i];
}
delete [] grid;
numRows=source.GetRows(); // numRows becomes the assigned number of rows here.
// This is not a problem, because now you don't need to
// remember how many rows you need to delete.
numColumns=source.GetColumns();
numBombs=source.GetBombs();
...
}
这类问题正是为什么手动使用delete
和new
是一个可怕的想法——此外,它也不是例外安全的(如果在构造函数中,在您已经分配了其他内容之后,分配其中一行失败,会发生什么?您会丢失以前在构造函数中分配的每一块内存,直到关闭程序才被看到。)
对此,更简单的解决方案是应用R资源A获取IsII初始化习惯用法(简称RAII),并使用一个容器来控制资源,该容器通过在构建时分配资源和在销毁时解除分配来控制资源——矢量可以为您做到这一点,智能指针等漂亮的东西也可以。这就免除了您处理每一个问题的责任。仅有一个的分配。如果。甚至。a.单身。一失败,因为有了RAII,如果失败,已经分配的资源就会清理本身。
举个例子,如果我对grid
使用向量的向量,而不是对一堆c风格动态数组使用c风格动态阵列,那么赋值运算符可能会是什么样子:
void SweeperGrid::operator= (SweeperGrid const & source){
numRows=source.GetRows();
numColumns=source.GetColumns();
numBombs=source.GetBombs();
grid = source.grid;
}
相关文章:
- 2D数组来自文本输入,中间有空格
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 使用矢量将文本文件中的输入存储到 2D 数组中
- 获取 2D 数组 c++ 中的所有数字对
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 如何打印 2D 字符数组C++
- 如何将数组 2d 作为参数从函数传递并返回数组 2d 此函数
- 数组 2D 多个值
- 创建数组数组 (2D),而无需在 Java 中初始化内部数组
- 如何在C++中将文本文件传输到数组2D
- 从同一类的另一个方法调用数组2D-C++
- 获取地址在数组2d中的位置