2014-02-22 179 views
0

我不知道如何解決這個問題,下面是一個非常簡單的類,它將2D動態數組和大小存儲到一個對象(矩陣)中。我的問題是,初始化這些類中的一些不起作用,除非我調用成員函數。我縮小了問題的範圍,這是造成這種情況的析構函數。與析構函數的奇怪行爲

Square_Matrix a; //works 
Square_Matrix b; 

Square_Matrix a,b; //works 
a.Set_Size(5); 

Square_Matrix a,b; //doesn't work as a lone statement, the above does though 

頭文件:

#include <iostream> 
using namespace std; 

class Square_Matrix 
{ 
public: 
    int **matrix; 
    int size; 
    Square_Matrix(); 
    ~Square_Matrix(); //causing the problem 
    void Set_Size (int new_size); 
} 

.cpp文件:

#include <iostream> 
using namespace std; 
#include "Square_Matrix.h" 


Square_Matrix::Square_Matrix() 
{ 
    size = 0; 
} 

Square_Matrix::~Square_Matrix() //causing the problem 
{ 
    for (int i = 0; i < size; i++){ 
     delete [] matrix[i]; 
    } 
    delete [] matrix; 
} 
+0

此外,即使我添加一個if語句(如果大小> 0)它仍然有同樣的問題。 – Foxic

+0

你還沒有描述*問題*。你說「初始化班級不起作用」。那是什麼意思?當你嘗試做什麼會發生什麼? – jalf

回答

2

您的默認構造函數不初始化數據成員矩陣。所以你的程序有未定義的行爲。

您可以定義析構函數和構造器通過以下方式

Square_Matrix::Square_Matrix() 
{ 
    size = 0; 
    matrix = nullptr; 
} 

或者

Square_Matrix::Square_Matrix() : matrix(nullptr), size(0) 
{ 
} 

Square_Matrix::~Square_Matrix() //causing the problem 
{ 
    if (matrix) 
    { 
     for (int i = 0; i < size; i++){ 
      delete [] matrix[i]; 
     } 
     delete [] matrix; 
    } 
} 

也考慮到,你需要或者定義拷貝構造函數和拷貝賦值運算符或禁止複製和帳戶分配你的班級的對象。