/ *编辑:我不确定我是否做错了什么,但是一些评论和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;
}
答案 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,则当前实现将保留未初始化的对象,并且进一步的析构函数将中止。