C ++继续"中止(核心转储)"删除类中的动态2D数组时

时间:2018-03-31 03:11:36

标签: c++ arrays dynamic delete-operator

/ *编辑:我不确定我是否做错了什么,但是一些评论和downvotes让我觉得对于提出一个简单的问题感到非常愚蠢。

我很欣赏建设性的批评,因为我是一个完整的编码noobie。对于那些帮助过我的人,我非常感激,并且我确实学到了很多东西。

我只是希望你们中的一些人在回答我的问题时不那么粗鲁。好吧,带上downvotes。 * /

大家好,这是我的第一个问题!我创建了一个简单的Array类,允许用户创建具有指定行和列的动态2D数组。在调用析构函数之前,一切正常,我尝试删除动态创建的数据数组。

我将提供我的标题和实现文件:

/* Array.h
 * Array Class Header File
 */

#ifndef ARRAY_H
#define ARRAY_H

class Array{
  private:
    int row;
    int col;
    int **data;
  public:
    Array(int,int);
    ~Array();
    int getRow() { return row;}
    int getCol() {return col;}
    int getData(int,int);

};

#endif




/* Array.cpp
 * Array implementation file
 */

#include <iostream>
#include <cstdlib>
#include "Array.h"

using namespace std;

//Constructor
Array::Array(int rowIn,int colIn){
// RowIn and ColIn must be greater than 1 to create matrix
  if(rowIn <= 1 || colIn <= 1){
    cout << "Row and column must be greater than 1" << endl;
    return;
  }
// If they are greater than 1 then set member variables
  row = rowIn;
  col = colIn;

// Allocate memory for 2D Array
  data = new int*[row];
  for(int i = 0; i < row; i++){
    data[i] = new int[col];
  }

// Fill 2D array with random numbers
  for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      data[i][j] = rand()%90 + 10;
    }
  }

}

// Getter function that returns data at row and col
int Array::getData(int row,int col){
  return data[row][col];
}

//Destructor
Array::~Array(){
  for(int i = 0; i < row; i++){
    delete[] data[i];
  }

  delete []data;
}



/* Main.cpp
 * File to test array class
 * 
 */
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "Array.h"

using namespace std;

void printArray(Array);

int main(){
  int t = time(0);
  srand(t);

  Array test(10,10);

  printArray(test);

  return 0;
}

void printArray(Array a){
  for(int i = 0; i < a.getRow(); i++){
    for(int j =0 ; j < a.getCol(); j++){
      cout << a.getData(i,j) << " ";
    }
    cout << endl;
  }

2 个答案:

答案 0 :(得分:0)

您需要将打印函数声明为void printArray(Array& a),否则,传递时会复制数组(默认情况下,C和C ++是传值=复制)。

因此,在调用print之后,副本会释放所有指针(正确),然后原件再次 - 相同的数据 - 这是未定义的行为。

答案 1 :(得分:0)

如果您不想做很多事情,请删除复制构造函数和赋值运算符:

Array(const Array&) = delete;
const Array& operator= (const Array&) = delete;

并更改声明和定义

void printArray(const Array &a);

还要小心构造函数。如果通过参数向其传递0或1,则当前实现将保留未初始化的对象,并且进一步的析构函数将中止。